Jakarta ee 不带CriteriaBuilder的列表中的jpql对象
我必须在用户组列表中的Invoice.responsible处获取所有发票 我尝试了以下几点: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
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()*/
..
}