2012-06-13 16 views
6

私は、いくつかの@onetomany関係を持つオブジェクトを持っています。子のプロパティだけでなく、親のプロパティも照会する必要があります。私はそれを完了するように見えることはできません。Hibernate HQL childIDに基づいて親子を取得するクエリ

たとえば、親の名前が "John"の場合、の子のお気に入りの色が青であるParentオブジェクトを表示するクエリが必要です。希望は意味をなさない。合併症の理由は、子どもがリストにあり、@onetooneの関係にないということが原因です。

PARENT: 
@Entity 
@Table(name="Parent") 
public class Parent { 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="parent_gen") 
    @SequenceGenerator(name="parent_gen", sequenceName="PARENT_SEQUENCE") 
    private int parentID; 

    @Column(name="name") 
    private String name; 

    @OneToMany(cascade=CascadeType.ALL) 
    @OrderBy("name ASC") 
    @JoinTable(name = "parent_to_child") 
    private List<Child> childList; 
    // and so forth 

Child 
@Entity 
@Table(name="Child") 
public class Child{ 
    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="child_gen") 
    @SequenceGenerator(name="child_gen", sequenceName="CHILD_SEQUENCE") 
    private int childID; 

    @Column(name="favoriteColor") 
    private String favoriteColor; 

    // and so forth 

答えて

6
select p from Parent p join p.childList c 
    where p.name = 'John' and c.favoriteColor = 'blue' 

これはList<Parent>を返します。

from Parent as parent 
    left join parent.childList as children 
     with children.favoriteColor = 'blue' 
where parent.name = 'John' 
+0

を使用して一方向の関係で親をフェッチ[1]。これはうまくいくかもしれませんが、私はそれが "本当の"オブジェクトを返すと考えましたか?私は返される汎用オブジェクトから親子をフェッチする方法を理解する必要があります...私はそこに着きます! – Jorge

+0

@ user1454878これにはselect節が必要です。私は答えを編集します。 – Pablo

+0

これは、favoriteColorが青、赤または白かどうかに関係なく、リスト内のすべての子オブジェクトを表示します。それは普通ですか?好きな色を青色にしている子オブジェクトだけを表示することになっていませんでしたか? – Eniss

1

でこのすべてを見ることができますオブジェクトの方法:

SELECT p FROM Parent P, IN (P.childList) C 
WHERE P.name='John' and C.favoriteColor='blue'; 

演算子INはリストを繰り返し処理するため、JOINを使用する必要はありません。

0

JPQLは、これらのケースでは、物事が容易になり、特別な構文を提供し、あなたが指向で考えるのに役立ちます:

あなたは、次のような何かを試してみてくださいhql reference

0
Criteria criteria=session.createCriteria(Parent.class); 
criteria.add(Restrictions.eq("name", "John")); 
criteria.createAlias("childList", "child"); 
criteria.add(Restrictions.eq("child.favoriteColor", "Blue").ignoreCase()); 

また、条件APIを試すこともできます。

0

あなたの条件に親の "left join fetch"子をする必要があります。

それはどこオブジェクト[0] =親やオブジェクト[1] =子リストになります取得せずにリストに<親>

を結果を与える "フェッチ左結合しました"。子クラスに基づいて

0
public class Clients implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
     @OneToMany(cascade = { CascadeType.ALL},orphanRemoval=true) 
     @JoinColumn(name="client_id") 
     List<SmsNumbers> smsNumbers; 
     } 

@Table(name="smsnumbers") 
    public class SmsNumbers implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    int id; 
String number; //getter and setter 
} 

私は、これが2つの異なるオブジェクト、[0]と子供における親としての結果をフェッチするように思われる次の基準〜

Session session = HibernateUtil.openSession(); 
    try{ 
     Criteria criteria=session.createCriteria(Clients.class); 
    criteria.createAlias("smsNumbers", "child"); 
    criteria.add(Restrictions.eq("child.number", phone).ignoreCase()); 
    Clients cli=(Clients) criteria.list().get(0); 
    System.out.println(cli.getId()); 
    }catch (Exception e) { 
     // TODO: handle exception 
    } 
関連する問題