7

複数の @onetomany 関係を持つオブジェクトがあり、親のプロパティと子のプロパティを照会する必要があります。私はそれを成し遂げることができないようです。

たとえば、親の名前が「ジョン」で、子供の好きな色が青である親オブジェクトを表示できるクエリが必要です。それが理にかなっていることを願っています。複雑な理由は、子供が @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
4

6 に答える 6

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

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

これはすべてhqlリファレンスで見ることができます

于 2012-06-13T22:54:00.817 に答える
1

次のようにしてみてください。

from Parent as parent
    left join parent.childList as children
        with children.favoriteColor = 'blue'
where parent.name = 'John'
于 2012-06-13T23:18:59.230 に答える
1

あなたがする必要があります---あなたの条件で「左結合フェッチ」子を親にします。

" left join fetch " は結果を List< Parent> に与える

Fetch がなければ、object[0] = 親、object[1] = 子の List になります。

于 2016-08-17T21:03:44.020 に答える
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で試すこともできます。

于 2012-06-15T17:14:55.353 に答える
0

JPQL は特別な構文を提供します。このような場合、物事が簡単になり、指向オブジェクトの方法で考えるのに役立ちます。

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

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

于 2012-06-13T23:26:49.147 に答える