13

私は2つのエンティティを持っています

PayoutHeader.java

@Entity
public class PayoutHeader extends GenericDomain implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        
    @Column
    private Integer month;
    @Column
    private Integer year;
    @OneToOne
    private Bank bank;
    @Column
    private Double tdsPercentage;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date **chequeIssuedDate**;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date entryDate;

}

PayoutDetails .java

@Entity
public class PayoutDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        

    @ManyToOne
    private PayoutHeader payoutHeader;

    @Column
    private Double amount;
    @Column
    private String bankName;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date clearingDate;
    @OneToOne    
    private Advisor advisor;

    @Column
    private Long **advisorId**;
}

HibernateCriteriaを使用してクエリを記述したい

Select pd.* from PayoutDetails pd, PayoutHeader ph where pd.payoutheaderId = ph.id and pd.advisorId = 1 and and ph.chequeIssuedDate BETWEEN STR_TO_DATE('01-01-2011', '%d-%m-%Y') AND STR_TO_DATE('31-12-2011', '%d-%m-%Y') ";

私はこのようなクエリを書きました

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) {
        Criteria criteria = getSession().createCriteria(PayoutDetails.class);

        if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) {
            criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString()));
        }

        criteria.setFetchMode("PayoutHeader", FetchMode.JOIN)
                .add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));        

        return criteria.list();
    }

しかし、次のようにエラーを与えています

org.hibernate.QueryException:プロパティを解決できませんでした:chequeIssuedDate of:org.commission.domain.payout.PayoutDetails

chequeIssuedDateでフィールドを見つけようとしていると思いますがPayoutDetails、このフィールドはでPayoutHeaderです。結合中にエイリアスを指定するにはどうすればよいですか?

4

1 に答える 1

14

criteria.setFetchMode("PayoutHeader", FetchMode.JOIN)、結合によってヘッダーを取得することを指定するだけであり、この場合はおそらく不要です。制限で使用されるテーブルは変わりません。そのためには、次のように追加の条件またはエイリアスを作成する必要があります。

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) {
        Criteria criteria = getSession().createCriteria(PayoutDetails.class);

        if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) {
            criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString()));
        }

        criteria.createCriteria("payoutHeader")
                .add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));        

        return criteria.list();
    }

または (エイリアスを使用)

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) {
        Criteria criteria = getSession().createCriteria(PayoutDetails.class);

        if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) {
            criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString()));
        }

        criteria.createAlias("payoutHeader", "header")
                .add(Restrictions.between("header.chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));        

        return criteria.list();
    }

この例については、Criteria Queries の Hibernate ドキュメントを参照してください。

を文字列に変換することも適切ではない可能性がありますadvisorId。これは、実際には でLongあり、おそらく sql の数値フィールドにマップされているためです。

をマッピングする場合、このadvisorIdフィールドのようなものをまったくマッピングせずadvisor、フィールドに基づく制限を使用することも一般的です。advisorこれは、これがフィールドを処理する方法と同様payoutHeaderです。

ヘッダーからすべてのフィールドを取得することについては心配しませんが、createCriteriaバージョンを機能させると、動作が少し異なる可能性があります。

于 2012-07-16T11:13:58.027 に答える