私には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**;
}
次のようなHibernate Criteriaを使用してクエリを記述したい
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
にあります。結合中にエイリアスを指定する方法は?
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();
}
この例については、 基準クエリに関するHibernateドキュメント を参照してください。
advisorId
は実際にはLong
であり、おそらくSQLの数値フィールドにマップされているため、advisorId
を文字列に変換することも適切ではない可能性があります。
advisor
をマップし、advisor
フィールドに基づく制限を使用する場合、payoutHeader
フィールドのようなものもまったくマップしないことが一般的です。 [SOME_VARIABLE] _フィールド。
ヘッダーからすべてのフィールドを取得する必要はありませんが、createCriteria
バージョンを機能させると、動作が少し異なる場合があります。