2017-04-16 85 views
0

我試圖執行簡單的條件,但得到「org.hibernate.QueryException:無法解析屬性」。 其實我有上ProcessInstanceJPA申請條件,但它不是在ExpenseHeaderJPA承認processInstanceJPA。獲取org.hibernate.QueryException:無法解析屬性,甚至屬性完全相同

標準:

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

ProcessInstaceJPA

@Entity 
@Table(name="process_instance") 
public class ProcessInstanceJPA { 

    @Id @GeneratedValue 
    @Column(name="process_instance_id") 
    private Long processInstanceId; 

    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="expense_header_id") 
    /*@OneToOne 
    @PrimaryKeyJoinColumn*/ 
    private ExpenseHeaderJPA expenseHeaderJPA; 

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

    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="pending_at") 
    private EmployeeJPA pendingAt; 

    public Long getProcessInstanceId() { 
     return processInstanceId; 
    } 

    public void setProcessInstanceId(Long processInstanceId) { 
     this.processInstanceId = processInstanceId; 
    } 

    public ExpenseHeaderJPA getExpenseHeaderJPA() { 
     return expenseHeaderJPA; 
    } 

    public void setExpenseHeaderJPA(ExpenseHeaderJPA expenseHeaderJPA) { 
     this.expenseHeaderJPA = expenseHeaderJPA; 
    } 

    public VoucherStatusJPA getVoucherStatusJPA() { 
     return voucherStatusJPA; 
    } 

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

    public EmployeeJPA getPendingAt() { 
     return pendingAt; 
    } 

    public void setPendingAt(EmployeeJPA pendingAt) { 
     this.pendingAt = pendingAt; 
    } 
} 

ExpenseHeaderJPA

@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; 
    } 

} 

ExpenseHeaderJPA是父表和ProcessInstanceJPA是子表。它們之間有OnetoOne映射。當我試圖對ProcessInstaceJPA的任何屬性應用限制時,我收到了無效的屬性錯誤。

MySQL數據庫結構:

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, 
... 
... 
) 

請幫助解決這個問題。

+0

您沒有使用JPA,所以不知道爲什麼,你以後調用它的東西。 –

回答

0

我沒有在你whant做什麼瞭解,但似乎你想加入,而不是一個等號。

我認爲,限制類沒有這個選項,你可以用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. 
+0

我想在processInstanceJPA上應用條件。但它顯示以上錯誤 –

+0

你想申請什麼條件?請更具體。你試過這個嗎? – Motomine

+0

ExpenseHeaderJPA是父表,ProcessInstanceJPA是子表。它們之間有OnetoOne映射。 當我試圖對ProcessInstaceJPA的任何屬性應用限制時,我收到無效的屬性錯誤。 –

相關問題