2013-07-06 27 views
1

我有兩個班級,分別是AB
A有一組B作爲其屬性。 BA不理解。
HQL無法理解一個班級的屬性,這是另一個班級的集合

Class A { 
    @OneToMany(fetch=FetchType.LAZY) 
    @JoinTable(name = "A_B_MAPPING", joinColumns = @JoinColumn(name = "A_ID") , inverseJoinColumns = @JoinColumn(name = "B_ID")) 
    private Set<B> bs; 
} 

問題是,當我想刪除不具有BA這些記錄,HQL不理解!我的代碼是這樣的:

String hql = "DELETE FROM A WHERE bs IS NULL"; 
Query query = getSession().createQuery(hql); 
query.executeUpdate(); // <-- Here an exception is thrown 

當它看來,HQL是無法理解,這家酒店是不是一個列,它必須加入到A_B_MAPPING
我也注意到,生成的查詢是指這個bs屬性
non-qualified-property-ref

所以問題是,我如何修改我的查詢來實現我的目標?

+0

當你調用'executeUpdate()'方法時,你可以給你的問題添加異常的整個堆棧跟蹤嗎? – eternay

回答

0

在HQL中,您需要聲明一個別名以將其用作實例變量並訪問這些字段。嘗試修改您的查詢這樣的:

String hql = "DELETE FROM A a WHERE a.bs IS NULL"; 

與HQL和收藏的另一個問題是,也許,集合不能爲空,但空。在這種情況下,你應該使用is empty,而不是is null

String hql = "DELETE FROM A a WHERE a.bs IS EMPTY"; 

我認爲你需要的is empty查詢的形式爲您解決問題。

+0

如果該組被分配了NULL,該怎麼辦? 'EMPTY'還能應用嗎?它是否適用於這兩種情況? –

+0

你應該嘗試,但我認爲Hibernate總是創建一個空的Set。你不應該有'a.bs'引用的NULL屬性。所以你應該在你的where子句中使用'empty'表達式。 – eternay

+0

謝謝。聲明別名完成了這項工作。 –

相關問題