У меня есть объект, которому сопоставлен набор объектов, очень просто. Тем не менее, что я действительно хочу сделать, так это поставить некоторые критерии для этого сопоставления. Вот текущее отображение:
<set name = "ops" inverse = "true" cascade = "all, delete-orphan">
<key column = "cityblock_id" on-delete = "cascade"/>
<one-to-many class = "com.tamedtornado.data.Operation"/>
</set>
Теперь, вместо того, чтобы просто получать все связанные операции, я хочу просто получить операции, которые не завершены, или есть, или что-то еще. В документации по Hibernate очень тихо по этому поводу, хотя некоторые старые сообщения на форуме показали мне немного. Очевидно, вы можете использовать тег sql-query, но это тоже не то, что я хочу делать.
Есть ли способ сделать это с помощью запроса HQL? Я просто хочу сузить результаты простым запросом и иметь несколько карт коллекций, таких как active_ops, completed_ops и т. д.
Ваше здоровье, Джейсон




Я не уверен, правильно ли я понимаю ваш вопрос, но похоже, что вам нужно использовать предложение where в вашем SQL-запросе
Вы должны иметь возможность использовать предложение where в своем HQL или использовать api критериев в спящем режиме для достижения желаемых результатов:
Предположим, у вас есть поле под названием status для «активного» или «завершенного», ваш HQL должен выглядеть примерно так:
from ops where status = "active"
или при использовании критериев api:
List activeOperations = sess.createCriteria(Operation.class)
.add( Restrictions.equals("status", "active") )
.list();
Об этом немного рассказывается в главах 14 и 15 руководства по гибернации: http://www.hibernate.org/hib_docs/v3/reference/en/html/index.html
В разделе 6.2. Сопоставления коллекций в документации Hibernate вы обнаружите, что можете использовать предложение WHERE для любого сопоставления коллекции:
где (необязательно) укажите произвольное условие SQL WHERE, которое будет использоваться при извлечении или удалении коллекции (полезно, если коллекция должна содержать только подмножество доступных данных)
Вы сказали, что хотите использовать HQL-запрос, но я не думаю, что это возможно. Но поскольку вам нужно указать только простое предложение WHERE в вашем сопоставлении, нет особой разницы между HQL и «настоящим» SQL.