2009-10-28 4 views
1

В файле сопоставления hibernate я использую формулу свойства для получения любого значения.hibernate формулу свойства, как получить более 1 строки?

<property name="price" type="double" formula="(select SUM(amount) ...) /> 

Но он позволяет получить только 1 ряд. Как я могу получить строки? Я понимаю, что «свойство» не подходит, но невозможно добавить формулу для набора или списка.

Конечно, я просто хочу получать значения без добавления новых классов. У меня только запрос sql и ожидаю получить список или установить существующий класс.

+0

Похоже, вы действительно хотите иметь 1: ссылку м, без «правильного» эталонного поля. Это правильно? –

+0

Ну, мне нужно добавить список в мой класс. Он будет использовать ТОЛЬКО для отображения дополнительной информации об этом объекте. И эти таблицы не покрываются картографическим файлом, потому что они используются другим приложением. –

ответ

1

Свойства формулы работают только в текущей строке. Если вы хотите выполнять агрегированные функции, вам нужно написать конкретный запрос для их получения. См. section of the hibernate docs that handle aggregate functions.

+0

Да, я могу написать запрос, который возвращает больше tnen 1 row, но как сохранить этот результат в моем классе? И я хочу установить этот запрос в файле сопоставления xml, связанном с моим классом. –

+0

Вы не можете, вот что я говорю. У вас не может быть свойства строки, содержащей данные из нескольких строк, что не имеет смысла. – skaffman

+1

Я не говорю, что хочу точно свойство. Пусть это будет список или набор или что-то еще, не имеет значения, но как? –

0

Формулы применяются только к однозначным свойствам; а не коллекциям. Однако вы можете указать custom SQL statement to be used for loading a collection.

Трудная часть здесь заключается в том, что из вашего вопроса это звучит так, как вам хочется, это набор элементов (double цена), а не сущности; Я никогда не пытался указать пользовательский загрузчик для чего-то подобного, и поэтому не уверен, будет ли он работать. Документация довольно молчала по этому вопросу.

Если вышеуказанное не работает, другой вариант заключается в том, чтобы определить ваш SELECT как коллекцию вида и карты таким образом (опять же, как сбор элементов).

Наконец, вы также можете запустить запрос, например, skaffman. Вам нужно будет вызвать этот запрос и заполнить коллекцию на вашем объекте вручную, когда это необходимо (например, внутри вашего DAO после загрузки объекта). Ro 0 можно сделать define an appropriate listener и сделать это там.

+0

мертвая ссылка ...пример кода был бы более полезен – Gus

+0

Yup, мертвые ссылки очень хромые. – Casey

1

Если формула возвращает более одной строки, вы должны связать заявление с идентификатором объекта, например:

выберите имя столбца
из таблицы где таблица .identifier = entity_identifier

Что касается применения этого к набору значений, может быть применима группа по функциям. Однажды я использовал group_concat из mysql, чтобы показать список значений. Плохо то, что формула была связана с родным диалектом mysql, но это сработало.

+0

Приятно знать о функции group_concat. Спасибо, что разместили предложение. –