java - Hibernate Join 使用条件和限制

标签 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;

}

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: could not resolve property: chequeIssuedDate of: org.commission.domain.payout.PayoutDetails

我认为是试图在 PayoutDetails 中查找 chequeIssuedDate 字段,但该字段在 PayoutHeader 中。加入时如何指定别名?

最佳答案

criteria.setFetchMode("PayoutHeader", FetchMode.JOIN) 只是指定您希望通过连接获取 header ,在这种情况下可能不需要。它不会更改限制中使用的表。为此,您可能想要创建一个额外的条件或别名,大致如下所示:

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();
    }

参见 the Hibernate docs on Criteria Queries对于这方面的例子。

advisorId 转换为字符串也可能不合适,因为它实际上是一个 Long 并且可能映射到 sql 中的数字字段。

如果您映射 advisor 并且使用基于 advisor 的限制,通常也根本不会映射像这样的 advisorId 字段> 字段,类似于处理 payoutHeader 字段的方式。

我不会担心从 header 中获取所有字段,但如果您让 createCriteria 版本正常工作,它的行为可能会有点不同。

关于java - Hibernate Join 使用条件和限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502761/

相关文章:

java - 如何在 java 中从 .java 文件创建 "java.lang.Class"对象

java - 无法从 Java SE 客户端访问 EJB - 查找失败错误

java - 使用 Hibernate 查询数据库时出现语法错误

java - Entity.UserBean 无法转换为Entity.UserBean

spring - 使用条件查询/hibernate 查询选择最大 id 行时出现问题?

java - 如何使用 Stream 从 java Map 创建多个列表?

java - netty writeAndFlush https 数据报未得到响应

java - 从外键获取 ID 的 JPA 命令

java - 使用条件创建别名时列索引超出范围

hibernate - 如何在可以为空的字段上创建条件?