2013-11-22 19 views
0

我必須得到所有Invoice其中Invoice.responsibleUsergroup列表中?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()*/ 
    .. 

    } 

+0

您能告訴我們'Invoice'實體嗎? –

+0

我將它們添加到問題 – Khinsu

+0

嘗試了不同的JPA實現,以檢查它是否特定於您的提供者?我可以在DataNucleus JPA上查詢成功。 – DataNucleus

回答

0

你的問題是在這裏i.responsible IN (:usergroups)。它應該是i.responsible IN :usergroups(沒有pamentalhesis)。另外請記住,有些JPA實現會拋出異常,如果hte列表爲空,所以您應該介意檢查該異常。

+0

我將它改爲'「選擇我從發票我在哪裏(i.responsible IN用戶組)和i.entered = false AND i.totalcosts>(SELECT SUM(b.costs)FROM Benefit b WHERE b.invoice = i)ORDER BY i.creationdate ASC「'但我仍然得到相同的錯誤 – Khinsu

+0

你試過'選擇我從發票我在哪裏i.responsible IN usergroups'孤單? –

+0

是的,同樣的錯誤。 – Khinsu