5

質問したいのですが、複数レベルの深さのクエリ プロジェクションと基準を作成することは可能ですか? 私は2つのモデルクラスを持っています:

@Entity  
@Table(name = "person")  
public class Person implements Serializable {
    @Id
    @GeneratedValue
    private int personID;
    private double valueDouble;
    private int valueInt;
    private String name;
    @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true)
    @JoinColumn(name="wifeId")
    private Wife wife;
       /*   
        *  Setter Getter    
        */
}


@Entity 
@Table(name = "wife")  
public class Wife implements Serializable {

    @Id
    @GeneratedValue     
    @Column(name="wifeId")
    private int id;
    @Column(name="name")
    private String name;
    @Column(name="age")
    private int age;            
    /*
     *  Setter Getter
     */       
}

私の基準API:

ProjectionList projections = Projections.projectionList(); 
projections.add(Projections.property("this.personID"), "personID");
projections.add(Projections.property("this.wife"), "wife");
projections.add(Projections.property("this.wife.name"), "wife.name");

Criteria criteria = null; 
criteria = getHandlerSession().createCriteria(Person.class); 
criteria.createCriteria("wife", "wife", JoinType.LEFT.ordinal()); 
criterion = Restrictions.eq("wife.age", 19);  
criteria.add(criterion); 
criteria.setProjection(projections);
criteria.setResultTransformer(Transformers.aliasToBean(Person.class)); 
return criteria.list();

そして、妻のプロパティの指定された基準と指定された戻り値の結果セットを使用して、Person を照会できることを願っています。だから私は指定された戻り結果セットを取得するためにプロジェクションを使用しました

personIDが欲しい、名前(人)、名前(妻)が返ってくる。どのように API を使用する必要があるか、私は Hibernate Criteria API を使用することを好みます。

今回は、上記のコードを使用して期待どおりの結果を取得しましたが、例外がスローされ、エラー メッセージ : が返され、年齢値が 19 の妻を持つ人を取得するのに正しいException in thread "main" org.hibernate.QueryException: could not resolve property: wife.name of: maladzan.model.Personかどうか?Restrictions.eq("wife.age", 19);

ありがとう

4

4 に答える 4

6

私の知る限り、aliastobean トランスフォーマーを使用して複数のレベルを深く投影することはできません。あなたの選択肢は

  • フラット化されたデータ転送オブジェクト (DTO) を作成する
  • 結果の Person を自分でメモリに入力します
  • 独自の resulttransformer を実装する (オプション 2 と同様)

オプション 1 は次のようになります。

Criteria criteria = getHandlerSession().createCriteria(Person.class)
    .createAlias("wife", "wife", JoinType.LEFT.ordinal())
    .add(Restrictions.eq("wife.age", 19)); 
    .setProjection(Projections.projectionList()
        .add(Projections.property("personID"), "personID")
        .add(Projections.property("name"), "personName")
        .add(Projections.property("wife.name"), "wifeName"));
    .setResultTransformer(Transformers.aliasToBean(PersonWifeDto.class));

return criteria.list();
于 2012-08-29T06:30:20.713 に答える
-1

Data Transfer Object (DTO)
Inを作成する代わりに、projectionlist以下の変更を行うとうまくいきます。

    ProjectionList projections = Projections.projectionList(); 
    projections.add(Projections.property("person.personID"), "personID");
    projections.add(Projections.property("person.wife"), "wife");
    projections.add(Projections.property("wife.name"));

    Criteria criteria = null; 
    criteria = getHandlerSession().createCriteria(Person.class,"person").createAlias("person.wife", "wife"); 
    criterion = Restrictions.eq("wife.age", 19);  
    criteria.add(criterion); 
    criteria.setProjection(projections);
    criteria.setResultTransformer(Transformers.aliasToBean(Person.class)); 
    return criteria.list();
于 2015-09-23T07:54:42.773 に答える