2012-01-20 10 views
12

Digamos que tengo una clase de dominio llamada "Usuario" que puede seguir a otros objetos "Usuario". Y lo hace con un campo especifica como:¿Cómo busco elementos cuya colección contiene otro elemento en Grails?

def hasMany=[followedUsers:User] 

Necesito hacer a la inversa (Encontrar todos los objetos de usuario que siguen un objeto de usuario específica) sin establecer la relación inversa, ya que no es un caso de uso se realiza a menudo . Traté de hacer algo como esto, el uso de cierres:

User.findAll { it.followedUsers.contains(userInstance) } 

pero esto siempre devuelve todos los usuarios en la base de datos, independientemente de su estado de seguimiento. Intenté hacerlo con HQL pero también fallé miserablemente.

¿Alguien podría darme un rápido apunte sobre la forma más sencilla de lograr esto? Gracias.

Respuesta

13

Se puede utilizar esta consulta HQL:

User.executeQuery(
    'select u from User u where :follower in elements(u.followedUsers)', 
    [follower: userInstance]) 
+2

Muchas gracias. Terminé haciendo 'def followers = User.findAll (" from User where? In elements (followsUsers) ", [userInstance])'. De hecho, había intentado esta solución antes, pero me faltaba la llamada 'elements()' para completarla. – ArmlessJohn

0

En mi opinión, esta sintaxis es mucho más limpio:

User.withCriteria { followedUsers{ eq('id', userInstance.id) } } 
Cuestiones relacionadas