2016-04-19 17 views
0

where句を使用して条件照会を作成して、子コレクション内の最初の&の姓に一致する必要があります。両方の名前が異なる行にあります子コレクションに複数の制限を設定するための休止条件

これは試しましたが、一致するデータが存在する場合でも何も返されません。おそらく同じ行の両方の制限を一致させるためです。

Criteria criteria = getCurrentSession().createCriteria(Form.class); 
criteria.createAlias("responses", "r"); 
criteria.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r.id", "firstName")) 
       .add(Restrictions.eq("r.value", getFirstName()))); 
criteria.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r.id", "lastName")) 
       .add(Restrictions.eq("r.value", getLastName()))); 

はこれを試み、これは例外org.hibernate.QueryExceptionいます:重複アソシエーションパス:回答

Criteria criteria = getCurrentSession().createCriteria(Form.class); 
criteria.createAlias("responses", "r1"); 
criteria.createAlias("responses", "r2"); 

criteria.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r1.id", "firstName")) 
       .add(Restrictions.eq("r1.value", getFirstName()))); 
criteria.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r2.id", "lastName")) 
       .add(Restrictions.eq("r2.value", getLastName()))); 

任意の助けを?

EDIT

説明から質問が明確ではなかったようです。ここでは基本的な要件です:

クエリ持つフォームクラスのすべてのレコードAND(ID = FirstNameおよび値= someName1を持つ子応答レコード)(ID = lastNameのAND値を持つ子応答レコード= someName2)

私はサブクエリを使用して私のために働いていたソリューションも追加しています。これが最善の方法だったが、それはORで照会するには私の問題

+1

問題が分かっている場合:ANDの代わりにORを使用してクエリしますか? – jpprade

+0

@jpprade私は実際にANDを望んでいた –

+0

@NarainMittal、私は混乱があなたの理解にあると思います。 2つの異なる行に制限を持つクエリを起動する必要がある場合は、ANDの代わりにANDを使用する必要があります。 ANDと言うと、両方の制限が同じ行に適用されます。だからjppradeがあなたに正しい解決策を提案したのは何ですか? – RAS

答えて

0

私の代わりにサブクエリを使用して問題を解決することができました。 hibernateが同じ子レコードの複数の結合をサポートしていないように見えます。

Criteria criteria = getCurrentSession().createCriteria(Form.class);    
DetachedCriteria subQuery1 = DetachedCriteria.forClass(Response.class); 
subQuery1.add(Restrictions.and(
    Restrictions.eq("id", "firstName").add(
    Restrictions.eq("value", getFirstName()))); 
subQuery1.setProjection(Projections.property("formId")); 

DetachedCriteria subQuery2 = DetachedCriteria.forClass(Response.class); 
subQuery2.add(Restrictions.and(
    Restrictions.eq("id", "lastName").add(
    Restrictions.eq("value", getLastName()))); 
subQuery2.setProjection(Projections.property("formId")); 
criteria.add(Restrictions.and(Subqueries.propertyIn("id", subQuery1), 
       Subqueries.propertyIn("id", subQuery2))); 
0

を解くかどうかわからない:

Criteria criteria = getCurrentSession().createCriteria(Form.class); 
criteria.createAlias("responses", "r"); 
Junction conditionGroup = Restrictions.disjunction(); 
conditionGroup.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r.id", "firstName")) 
       .add(Restrictions.eq("r.value", getFirstName()))); 
conditionGroup.add(Restrictions 
       .conjunction() 
       .add(Restrictions.eq("r.id", "lastName")) 
       .add(Restrictions.eq("r.value", getLastName()))); 
criteria.add(conditionGroup); 
関連する問題