Запрос гибернации: набор содержит определенный объект? - PullRequest
17 голосов
/ 02 февраля 2012

У меня есть два объекта данных Hibernate.Первый - это пользователь (с уникальным идентификатором, именем пользователя и т. Д.), А второй - класс Collaborateable.Между этими двумя есть отношение n-к-m (реализуемое с наборами).Это означает, что пользователь работает со многими Collaborateables, а Collaborateable имеет много пользователей.Кроме того, Collaborateable имеет только одного пользователя в качестве владельца.

<class name="CollaborateableImpl" table="Collaborateable">
<id name="id" type="int" column="id">
    <generator class="increment" />
</id>

<property name="name" column="name" type="string" not-null="true" />
<property name="keywords" column="keywords" type="string"/>

<!-- Collaborateable has a Registered User as owner -->
<many-to-one name="owner" class="UserImpl" fetch="select">
        <column name="User_id_owner" not-null="true" />
</many-to-one>

<!-- Users that collaborate on this Collaborateable -->
<set name="users" table="CollaborateOn" inverse="false">        
        <key column="Collaborateable_id" />         
        <many-to-many column="User_id" class="UserImpl" />    
</set>

Я хотел бы реализовать запрос Hibernate, который ищет Collaborateables, у которых есть определенный пользователь в качестве владельца ИЛИ, содержащий того же самогоопределенный пользователь в наборе Collaborateable.users.Кроме того, также должно быть простое предложение WHERE для проверки ключевых слов.

Есть ли что-то вроде оператора CONTAINS в Hibernate?

Например:

FROM CollaborateableImpl WHERE (owner = :user OR users CONTAINS :user) AND keywords like '%:searchString%'

В противном случае, вы знаете, как решить эту проблему с объединением?

1 Ответ

40 голосов
/ 02 февраля 2012

Вы ищете ключевое слово elements .

select c 
FROM CollaborateableImpl c 
WHERE (
    c.owner = :user 
    OR :user in elements(c.users)
)
AND c.keywords like '%:searchString%'
...