2011-07-03 5 views
6

のためのJPAのクエリを構築私はそれらの2つのエンティティをしましたOneToMany関係

Class A { 
    @OneToMany(mappedBy="a") 
    private List<B> bs; 
} 

Class B { 

    @ManyToOne 
    private A a; 

    private String name; 
} 

1)私が手に言うクエリを作成したいすべてのAの名前=「mohamede1945」

と少なくとも一つのBを持っています

2)私は誰も私を助けてもらえますか?名前=「mohamede1945」

を持つ任意のBを持っていないAのものをすべて取得すると言うクエリを作成したいと思いますか

+0

私の解決策は、あなたの質問に答えましたか? –

+0

ええ、ありがとう! – mohamede1945

答えて

9

ANYおよびALL構文を使用してサブクエリをフィルタできます。だから、すべての

1. FROM A aEntity WHERE 'mohamede1945' = ANY (SELECT bEntity.name FROM aEntity.bs bEntity) 

2. FROM A aEntity WHERE 'mohamede1945' <> ALL (SELECT bEntity.name FROM aEntity.bs bEntity) 
+0

http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html#ejb3_langref_all_any – illEatYourPuppies

10

まずのようなもの、私はあなたがこのリンクを見て、答えを学習し、JOINを検索することができると思う:

@Entity 
@NamedQueries({ 
@NamedQuery(name="A.hasBName",query="SELECT a FROM A a JOIN a.b b WHERE b.name = :name"), 
@NamedQuery(name="A.dontHasBName",query="SELECT a FROM A a JOIN a.b b WHERE b.name <> :name") 
}) 
Class A { /* as you defined */ } 
:すべての http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html

第二に、ここに私のアプローチでありますあなたDAOで

は、あなたがこのようnamedqueryを行うことができます。

public List<A> findByHasBName(String name){ 
    Query q = em.createNamedQuery("A.hasBName") 
      .setParameter("name", name); 
    try{ 
     return ((List<A>) q.getResultList()); 
    } catch (IndexOutOfBoundsException e){ 
     return null; 
    } 
} 
+0

ありがとうございます。最初のクエリは私とうまく動作します。私はすでにすでにこれを試してきましたが、うまくいきませんでした。 – mohamede1945

+0

もう1つは機能していませんか?それともどちらが作品を意味していますか? – illEatYourPuppies

+0

aからaを選ぶab b where <>:名前が機能しない – mohamede1945

関連する問題