我必須得到所有Invoice
其中Invoice.responsible
在Usergroup
列表中?jpql對象IN沒有CriteriaBuilder列表
我嘗試以下操作:
public List<Invoice> getOldestInvoiceWithOpenBenefits(List<Usergroup> usergroups) {
TypedQuery<Invoice> q = em.createQuery("SELECT i FROM Invoice i WHERE (i.responsible IN (:usergroups)) AND "
+ " i.entered = false AND i.totalcosts > (SELECT SUM(b.costs) FROM Benefit b WHERE b.invoice = i) ORDER BY i.creationdate ASC",
Invoice.class);
q.setParameter("usergroups", usergroups);
q.setMaxResults(10);
return q.getResultList();
}
但我alwasy得到這個錯誤:
Information: /pages/index.xhtml
Warnung: EJB5184:A system exception occurred during an invocation on EJB InvoicEJB, method: public java.util.List de.ltg.sachzuwendungen.ejb.InvoicEJB.getOldestInvoiceWithOpenBenefits(java.util.List)
Warnung: javax.ejb.EJBException
[...Stacktrace]
Caused by: Exception [EclipseLink-6075] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: Object comparisons can only use the equal() or notEqual() operators. Other comparisons must be done through query keys or direct attribute level comparisons.
Expression: [
Relation operator [ IN ]
Query Key responsible
Base de.ltg.sachzuwendungen.db.entity.Invoice
Constant [
Parameter usergroups]]
at org.eclipse.persistence.exceptions.QueryException.invalidOperatorForObjectComparison(QueryException.java:646)
[...Stacktrace]
有人可以幫助我得到這個工作,而無需使用CriteriaBuilder? 如果您需要數據庫實體請求。
預先感謝您。
編輯:
發票實體:
@Entity
@Table(name = "t_invoice")
public class Invoice implements Serializable {
private static final long serialVersionUID = 1L;
@Version
@Column(name = "version")
/**
* Optimistic Locking
*/
private int version;
@Id
@Column(name = "id")
private int id;
@Column(name = "number")
private String number;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@Column(name = "totalcosts")
private double totalcosts;
@Temporal(TemporalType.DATE)
@Column(name = "issuedate")
private Date issuedate;
@Temporal(TemporalType.DATE)
@Column(name = "creationdate")
private Date creationdate;
@Column(name = "entered")
private boolean entered;
@JoinColumn(name = "idUser_creator", referencedColumnName = "id")
private User creator;
@JoinColumn(name = "idUsergroup_responsible", referencedColumnName = "id")
private Usergroup responsible;
@OneToMany(mappedBy = "invoice")
private List<Benefit> benefits;
public Invoice() {
// TODO Auto-generated constructor stub
}
/*Getter & Setter*/
..
/*Override toString()*/
..
}
用戶組實體:
@Entity
@Table(name = "t_usergroup")
public class Usergroup implements Serializable {
private static final long serialVersionUID = 1L;
@Version
@Column(name = "version")
/**
* Optimistic Locking
*/
private int version;
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@ManyToMany(targetEntity = Right.class, fetch = FetchType.LAZY)
@JoinTable(name = "t_mapUsergroupToRight", joinColumns = { @JoinColumn(name = "idUsergroup") }, inverseJoinColumns = { @JoinColumn(name = "idRight") })
private List<Right> rights;
@ManyToMany(targetEntity = User.class, fetch = FetchType.LAZY)
@JoinTable(name = "t_mapUserToUsergroup", joinColumns = { @JoinColumn(name = "idUsergroup") }, inverseJoinColumns = { @JoinColumn(name = "idUser") })
private List<User> users;
/*Getter & Setter*/
..
/*Override toString() & equals() & hashCode()*/
..
}
您能告訴我們'Invoice'實體嗎? –
我將它們添加到問題 – Khinsu
嘗試了不同的JPA實現,以檢查它是否特定於您的提供者?我可以在DataNucleus JPA上查詢成功。 – DataNucleus