Jakarta ee 不带CriteriaBuilder的列表中的jpql对象

Jakarta ee 不带CriteriaBuilder的列表中的jpql对象,jakarta-ee,jpa,eclipselink,criteria,jpql,Jakarta Ee,Jpa,Eclipselink,Criteria,Jpql,我必须在用户组列表中的Invoice.responsible处获取所有发票 我尝试了以下几点: public List<Invoice> getOldestInvoiceWithOpenBenefits(List<Usergroup> usergroups) { TypedQuery<Invoice> q = em.createQuery("SELECT i FROM Invoice i WHERE (i.responsible IN (:userg

我必须在用户组列表中的Invoice.responsible处获取所有发票

我尝试了以下几点:

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();
}
有人能帮我在不使用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()*/
..
}
用户组实体:


你的问题在这里我负责:用户组。它应该负责:没有妄想症的用户组。还要记住,如果hte列表为空,一些JPA实现会抛出异常,所以您应该注意检查一下。

我将其更改为从发票i中选择i,其中i.responsible在用户组中,i.entered=false和i.totalcosts>从利益b中选择SUMb.costs,其中b.Invoice=i ORDER BY i.creationdate ASC,但我仍然收到相同的错误您是否尝试过从发票i中选择i,其中i.responsible在用户组中单独?你能给我们看一下发票实体吗?我用不同的JPA实现将它们添加到问题中,以检查它是否特定于你的提供商?我可以在DataNucleus JPA上成功地查询这些信息。您使用的EclipseLink版本是什么?那是JPA2.0吗?从JPA2.0开始,似乎就支持表达式中的集合值输入参数。您是否尝试升级Eclipse?Im使用GlassFish Server 3.1.2完整平台的buildin eclipselink版本,详细信息:
@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()*/
    ..

   }