2012-03-23 65 views
7

我試圖做一個查詢在休眠像下面的SQL查詢:休眠沒有在結表子查詢

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

我有以下實體類:

@Entity 
class User { 
    @Id 
    private Integer id; 

    @ManyToMany 
    private Set<Phone> phoneList; 

} 

和Phone類:

@Entity 
class Phone { 

    @Id 
    private Integer id; 

    private String description; 

} 

Hibernate會自動創建一個junctio名爲user_phone的表。現在我想選擇所有未被任何用戶使用的手機。我只是不知道如何用Hibernate做到這一點。我曾試過如下:

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

但返回所有其中ID是不一樣的任何手機的ID的用戶。所以這不是我要找的。

任何人都知道如何做到這一點?

回答

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

因爲我到了這裏尋找如何形成子查詢而不是標準,我想知道其他人是否也可能以同樣的方式結束。

因爲我想通了如何寫在HQL查詢,我想分享的解決方案,以防萬一:

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

爲我工作,在類似的情況。希望能幫助到你!