Rah*_*wal 14 java hibernate hibernate-criteria
我有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;
}
Run Code Online (Sandbox Code Playgroud)
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**;
}
Run Code Online (Sandbox Code Playgroud)
我想用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') ";
Run Code Online (Sandbox Code Playgroud)
我写了这样的查询
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();
}
Run Code Online (Sandbox Code Playgroud)
但是给出了错误
org.hibernate.QueryException:无法解析属性:chequeIssuedDate:org.commission.domain.payout.PayoutDetails
我认为是试图寻找chequeIssuedDate领域PayoutDetails,但这个领域是在PayoutHeader.如何在加入期间指定别名?
Don*_*oby 15
在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();
}
Run Code Online (Sandbox Code Playgroud)
或(使用别名)
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();
}
Run Code Online (Sandbox Code Playgroud)
有关此示例,请参阅Criteria Queries上的Hibernate文档.
它也可能不适合将advisorId字符串转换为字符串,因为它实际上是一个Long并且可能映射到sql中的数字字段.
advisorId如果您映射advisor,并且使用基于advisor字段的限制,与此处理payoutHeader字段的方式类似,通常也不会映射此字段之类的内容.
我不担心从标题中获取所有字段,但如果您使该createCriteria版本工作,它可能会有所不同.
| 归档时间: |
|
| 查看次数: |
47096 次 |
| 最近记录: |