Java Getting org.hibernate.QueryException:无法解析属性,即使属性完全相同

Java Getting org.hibernate.QueryException:无法解析属性,即使属性完全相同,java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,我试图执行简单的条件,但得到“org.hibernate.QueryException:无法解析属性”。 实际上,我必须对ProcessInstanceJPA应用条件,但它不能识别ExpenseHeaderJPA中的ProcessInstanceJPA 标准: List<ExpenseHeaderJPA> expsensHeaderList= session.createCriteria(ExpenseHeaderJPA.class) .add(Res

我试图执行简单的条件,但得到“org.hibernate.QueryException:无法解析属性”。 实际上,我必须对ProcessInstanceJPA应用条件,但它不能识别ExpenseHeaderJPA中的ProcessInstanceJPA

标准:

    List<ExpenseHeaderJPA> expsensHeaderList= session.createCriteria(ExpenseHeaderJPA.class)
            .add(Restrictions.eq("processInstanceJPA.processInstanceId", new Long(1))
            .list();
费用总支出

@Entity
@Table(name="expense_header")
public class ExpenseHeaderJPA {


@Id @GeneratedValue
@Column(name="expense_header_id")
private Long expenseHeaderId;

@OneToMany(orphanRemoval=true,mappedBy="expenseHeaderJPA",fetch=FetchType.EAGER) 
@Cascade({CascadeType.ALL})
@Fetch (FetchMode.SELECT)
private List<ExpenseDetailJPA> expenseDetailJPA; 

@OneToMany(orphanRemoval=true,mappedBy="expenseHeaderJPA",fetch=FetchType.EAGER) 
@Cascade({CascadeType.ALL})
@Fetch (FetchMode.SELECT)
private List<ProcessHistoryJPA> processHistoryJPA;

@OneToOne(orphanRemoval=true,mappedBy="expenseHeaderJPA",fetch=FetchType.EAGER) 
@Cascade({CascadeType.ALL})
@Fetch (FetchMode.SELECT)
private ProcessInstanceJPA processInstanceJPA;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee_id")
private EmployeeJPA employeeJPA;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "voucher_status")
private VoucherStatusJPA voucherStatusJPA;

@Column(name="start_date")
private Calendar startDate;

@Column(name="end_date")
private Calendar endDate;

@Column(name="title")
private String title;

@Column(name="purpose")
private String purpose;

public Long getExpenseHeaderId() {
    return expenseHeaderId;
}

public void setExpenseHeaderId(Long expenseHeaderId) {
    this.expenseHeaderId = expenseHeaderId;
}

public Calendar getStartDate() {
    return startDate;
}

public void setStartDate(Calendar startDate) {
    this.startDate = startDate;
}

public Calendar getEndDate() {
    return endDate;
}

public void setEndDate(Calendar endDate) {
    this.endDate = endDate;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getPurpose() {
    return purpose;
}

public void setPurpose(String purpose) {
    this.purpose = purpose;
}

public List<ExpenseDetailJPA> getExpenseDetailJPA() {
    return expenseDetailJPA;
}

public void setExpenseDetailJPA(List<ExpenseDetailJPA> expenseDetailJPA) {
    this.expenseDetailJPA = expenseDetailJPA;
}

public EmployeeJPA getEmployeeJPA() {
    return employeeJPA;
}

public void setEmployeeJPA(EmployeeJPA employeeJPA) {
    this.employeeJPA = employeeJPA;
}

public VoucherStatusJPA getVoucherStatusJPA() {
    return voucherStatusJPA;
}

public List<ProcessHistoryJPA> getProcessHistoryJPA() {
    return processHistoryJPA;
}

public void setProcessHistoryJPA(List<ProcessHistoryJPA> processHistoryJPA) {
    this.processHistoryJPA = processHistoryJPA;
}

public void setVoucherStatusJPA(VoucherStatusJPA voucherStatusJPA) {
    this.voucherStatusJPA = voucherStatusJPA;
}

public ProcessInstanceJPA getProcessInstanceJPA() {
    return processInstanceJPA;
}

    public void setProcessInstanceJPA(ProcessInstanceJPA processInstanceJPA) {
        this.processInstanceJPA = processInstanceJPA;
    }

}

请帮助解决此问题。

我完全不明白您不想做什么,但您似乎想要加入,而不是平等

我认为限制类没有这个选项,您可以使用CriteriaBuilder来实现

您可以这样做:

//you should initialize this variables depending on how you are working with hibernate
private CriteriaBuilder criteriaBuilder;
private CriteriaQuery<ExpenseHeaderJPA> criteria;
private Root<ExpenseHeaderJPA> root;
private Predicate exp;
exp.getExpressions().add(criteriaBuilder.equal(root.join(processInstanceJPA).get(processInstanceId), new Long(1)));

this.criteria.where(exp);
return session.createQuery().getResultList(); //I don't know what you have in session, but you should be able to create the query.
//您应该根据使用hibernate的方式初始化此变量
私人标准构建器标准构建器;
私有标准查询条件;
私根;
私有谓词exp;
exp.getExpressions().add(criteriaBuilder.equal(root.join(processInstanceJPA.get(processInstanceId)),new Long(1));
本标准,其中(exp);
返回session.createQuery().getResultList()//我不知道会话中有什么,但您应该能够创建查询。

您没有使用JPA,所以不知道为什么要在它之后调用。我想在processInstanceJPA上应用条件。但它显示了上面的错误,您希望应用什么条件?请说得更具体些。您尝试过这个吗?ExpenseHeaderJPA是父表,ProcessInstanceJPA是子表。它们之间有一对一的映射。当我试图对ProcessInstaceJPA的任何属性应用限制时,我遇到了无效属性错误。
    CREATE TABLE `expense_header` (
  `expense_header_id` bigint(10) NOT NULL AUTO_INCREMENT,
....
....

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

    CREATE TABLE `process_instance` (
  `process_instance_id` bigint(10) NOT NULL AUTO_INCREMENT,
  `expense_header_id` bigint(10) NOT NULL,
 ...
 ...
) 
//you should initialize this variables depending on how you are working with hibernate
private CriteriaBuilder criteriaBuilder;
private CriteriaQuery<ExpenseHeaderJPA> criteria;
private Root<ExpenseHeaderJPA> root;
private Predicate exp;
exp.getExpressions().add(criteriaBuilder.equal(root.join(processInstanceJPA).get(processInstanceId), new Long(1)));

this.criteria.where(exp);
return session.createQuery().getResultList(); //I don't know what you have in session, but you should be able to create the query.