2012-05-11 34 views
4

我有以下休眠實體不同的內部聯接HQL

public class Container { 
    ... 

    @OneToMany 
    private List<ACLEntry> aclEntries; 
} 

爲了確保我的容器實例我用下面的實體:

public class ACLEntry { 

    ... 
    private Long sid; 
    private boolean principal; 
    private Integer mask; 

} 

HQL的查詢將被自動創建,以便進行搜索容器實例, 將創建以下查詢:

select container from Container container 
inner join container.aclEntries as aclEntry 
with bitwise_and (aclEntry.mask, 1) = 1 and 
    (aclEntry.sid = :userId or aclEntry.sid = :roleId) 

問題在於aclentry連接可能返回2個結果,這會導致重複的容器結果。

有沒有人有一個想法如何解決這個問題?

回答

1

據我瞭解的問題,您需要一個容器,可以容納你的容器對象的多個條目只是下面的一個替代你的HQL查詢:

與添加select distinct爲本地查詢。

+0

我們使用內部查詢引擎來構建hql查詢,所以我不能添加不同的因爲它會影響所有查詢。我認爲獨特應該只適用於加入,或者我錯了嗎? –

+0

+1。這是正確和簡單的解決方案。如果查詢引擎無法處理它,則改進查詢引擎。 –

0

作爲一個蠻力的解決方案,你可以寫一個本地查詢。

+0

我們正在使用內部查詢引擎來構建我們的hql查詢,更改爲本機查詢,我們將不得不更改我們的查詢引擎 –

0

將其作爲標準查詢寫入此標記可能更有意義,其中easily supports selecting an object based on conditions of it's associations

同樣的事情可以在HQL或本地查詢中完成,執行Criteria查詢指定相同的邏輯並僅查看它生成的HQL/SQL可能是有益的。

+0

,如文檔中所述,條件api將執行兩個查詢,然後在第三步中加入結果;我認爲這種情況下,它不會執行足夠的大量結果集,或者我錯了嗎? –