Java Getting org.hibernate.QueryException:无法解析属性,即使属性完全相同
我试图执行简单的条件,但得到“org.hibernate.QueryException:无法解析属性”。 实际上,我必须对ProcessInstanceJPA应用条件,但它不能识别ExpenseHeaderJPA中的ProcessInstanceJPA 标准: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
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.