2012-02-02 17 views
14

Tengo dos objetos de datos Hibernate. El primero es un usuario (con identificación única, nombre de usuario, etc.) y el segundo es la clase colaborable. Entre estos dos existe una relación n-to-m (implementet con Sets). Eso significa que un Usuario trabaja en muchos Collaborateables y un Collaborateable tiene muchos usuarios. Además, un colaborador tiene exactamente un usuario como propietario.Consulta de hibernación: ¿un conjunto contiene un determinado objeto?

<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> 

me gustaría implementar una consulta de Hibernate, que busca Collaborateables que tienen un determinado usuario como propietario o contiene el mismo usuario determinado en el Conjunto Collaborateable.users. Además, también debe haber una cláusula WHERE simple para buscar palabras clave.

¿Hay algo así como un operador CONTAINS en Hibernate?

Por ejemplo:

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

De lo contrario, ¿sabe cómo resolver este problema con una unión?

Respuesta

35

Está buscando la palabra clave elements.

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

Si se usan criterios, ¿cuál es el tipo de restricción? – jpprade

Cuestiones relacionadas