2012-03-23 12 views
7

que estoy tratando de hacer una consulta en hibernación como la siguiente consulta SQL:Hibernate NO EN subconsulta en la tabla de unión

SELECT phone.* FROM phone WHERE phone.id NOT IN (SELECT phone_id FROM user_phone)

tengo las siguientes clases de entidades:

@Entity 
class User { 
    @Id 
    private Integer id; 

    @ManyToMany 
    private Set<Phone> phoneList; 

} 

y la clase de teléfono:

@Entity 
class Phone { 

    @Id 
    private Integer id; 

    private String description; 

} 

Hibernate crea automáticamente un junction n tabla llamada user_phone. Ahora me gustaría seleccionar todos los teléfonos que no usa ningún usuario. Simplemente no puedo entender cómo hacer eso con Hibernate. Había intentado lo siguiente:

Session session = (Session) entityManager.getDelegate(); 
Criteria criteria = session.createCriteria(Phone.class); 

DetachedCriteria subCriteria = DetachedCriteria.forClass(User.class); 
subCriteria.setProjection(Property.forName("phoneList")); 

criteria.add(Subqueries.propertyNotIn("id", subCriteria)) 

Pero que devuelve todos los usuarios en el que el ID no es el mismo que el ID de cualquiera de los teléfonos. Entonces eso no es lo que estoy buscando.

¿Alguien sabe cómo hacer esto?

Respuesta

6
Criteria criteria = session.createCriteria(Phone.class) 
    .add(Subqueries.propertyNotIn("id", DetachedCriteria.forClass(User.class) 
     .createAlias("phoneList", "phone") 
     .setProjection(Property.forName("phone.id")) 
    )); 
3

Desde que llegué aquí buscando la manera de formar una sub consulta y no criterios, me pregunto si otras personas podrían terminar aquí de la misma manera, también.

Desde que aprendimos a escribir la consulta en HQL, que quería compartir la solución, por si acaso:

from phone p where p.id not in (select ph.id from User u join u.phoneList ph)

trabajado para mí, en un escenario similar. ¡Espero eso ayude!

Cuestiones relacionadas