2013-11-22 4 views
0

я должен получить все Invoice где Invoice.responsible В список Usergroup?jpql объект IN список без критериевBuilder

Я попробовал следующее:

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? Если вам нужны объекты базы данных, просто спросите.

Заранее спасибо.

EDIT:

Счет Entity:

@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()*/ 
.. 
} 

UserGroup Entity:

@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 (без парантеса). Также имейте в виду, что некоторые реализации JPA выбрасывают исключения, если список hte пуст, поэтому вы не должны его проверять.

+0

Я изменил ее на '' SELECT i FROM Invoice i WHERE (i.responsible IN группы пользователей) И i.entered = false И i.totalcosts> (SELECT SUM (b.costs) FROM Benefit b WHERE b.invoice = i) ORDER BY i.creationdate ASC "', но im все равно получает ту же ошибку – Khinsu

+0

Вы пробовали 'SELECT i FROM Invoice i WHERE i.responsible В собственных группах? –

+0

есть, такой же ошибка. – Khinsu

Смежные вопросы