Как сделать сопоставления коллекций на основе пользовательских запросов в Hibernate? - PullRequest
2 голосов
/ 11 января 2009

У меня есть объект, который сопоставлен с набором объектов, очень просто. Однако, что я действительно хочу сделать, так это наложить некоторые критерии на это отображение. Вот текущее отображение:

    <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, complete_ops и т. Д.

Ура, Jason

Ответы [ 2 ]

3 голосов
/ 11 января 2009

Под 6.2. Отображения коллекций в документах Hibernate вы найдете, что вы можете использовать предложение WHERE для любого отображения коллекции:

где (необязательно) укажите произвольное условие SQL WHERE, которое будет использоваться при извлечении или удалении коллекции (полезно, если коллекция должна содержать только подмножество доступных данных) Вы сказали, что хотите использовать HQL-запрос, но я не думаю, что это возможно. Но поскольку вам нужно всего лишь указать простое предложение WHERE в вашем отображении, разница между HQL и «настоящим» SQL на самом деле невелика.

0 голосов
/ 11 января 2009

Я не уверен, правильно ли я понимаю ваш вопрос, но кажется, что вам нужно использовать выражение where в вашем SQL-запросе

Вы должны иметь возможность использовать условие where в вашем HQL или использовать критерии api в hibernate для достижения желаемых результатов:

Предположим, у вас есть поле с именем status для "active" или "complete", ваш 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

...