2012-03-23 8 views
7

Sto cercando di fare una query in ibernazione come la seguente query SQL:Hibernate NOT IN sottoquery sulla tabella di giunzione

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

ho le seguenti classi di entità:

@Entity 
class User { 
    @Id 
    private Integer id; 

    @ManyToMany 
    private Set<Phone> phoneList; 

} 

e la classe Telefono:

@Entity 
class Phone { 

    @Id 
    private Integer id; 

    private String description; 

} 

Hibernate crea automaticamente un junctio n tabella chiamata user_phone. Ora vorrei selezionare tutti i telefoni che non sono utilizzati da nessun utente. Non riesco a capire come farlo con Hibernate. Avevo provato la seguente:

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

Ma che restituisce tutti gli utenti in cui l'ID non è lo stesso che l'id di qualsiasi dei telefoni. Quindi non è quello che sto cercando.

Qualcuno sa come fare?

risposta

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

Da quando sono arrivato qui in cerca di come formare una sottoquery e non criteri, mi chiedo se altre persone potrebbero finire qui nello stesso modo, anche.

Da quando ho capito come scrivere la query in HQL, ho voluto condividere la soluzione, nel caso in cui:

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

lavorato per me, in uno scenario simile. Spero che sia d'aiuto!

Problemi correlati