2012-05-11 6 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つの結果を返す可能性があり、結果が重複してしまうことになります。

これを解決する方法は誰にもありますか?ネイティブクエリとしてselect distinctを追加することで

答えて

1

は、私の知る限りは、問題を理解して、あなただけの1を次のようにあなたのHQLクエリを置き換えるあなたのコンテナオブジェクトの複数のエントリを保持できるコンテナを必要としています。

+0

内部クエリエンジンを使用してhqlクエリを作成するので、すべてのクエリに影響するため、distinctを追加できません。私は、別名は結合にのみ適用する必要があると思いますか、間違っていますか? –

+0

+1。これが正しい簡単な解決策です。クエリエンジンがそれを処理できない場合は、クエリエンジンを改善します。 –

0

ブルートフォースの解決策として、ネイティブクエリを書くことができます。

+0

内部クエリエンジンを使用してhqlクエリを作成し、ネイティブクエリに変更してクエリエンジンを変更する必要があります。 –

0

easily supports selecting an object based on conditions of it's associationsというCriteriaクエリとしてこれを書く方が意味があります。

同じことをHQLまたはネイティブクエリで行うことができます。同じロジックを指定したCriteriaクエリを実行し、それが生成するHQL/SQLを見るだけで有益かもしれません。

+0

ドキュメントで述べられているように、条件APIは2つのクエリを実行し、私はこのケースでは、大きな結果セットを取得するのに十分な性能を発揮できないと思いますか、間違っていますか? –