我无法使用JPQL中的SIZE(collection_valued_path_expression)
函数来工作。这是我尝试过的一项测试:
Parent.java
@Entity
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Long id;
@OneToMany(mappedBy = "parent", cascade=CascadeType.ALL)
private List<Child> children;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children) {
this.children = children;
}
}
Child.java
@Entity
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Long id;
@ManyToOne
private Parent parent;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
Main.java
public static void main(String[] args) throws Exception {
...
EntityManager em = dao.getEntityManager();
Parent p = new Parent();
Child a = new Child();
Child b = new Child();
Child c = new Child();
List<Child> children = new ArrayList<Child>();
children.add(a); children.add(b); children.add(c);
p.setChildren(children);
em.persist(p);
Query query = em.createQuery("SELECT p.id, SIZE(p.children) FROM Parent p");
Object[] row = (Object[]) query.getSingleResult();
System.out.println(row[0]);
System.out.println(row[1]);
em.close();
}
控制台
线程中的异常&#34; main&#34; javax.persistence.NoResultException:getSingleResult()没有检索任何实体。
我做错了什么?用EclipseLink 2.3.2 and 2.5.1试验,数据库是MySQL。
答案 0 :(得分:0)
EclipseLink日志显示生成的查询是:
SELECT t0.ID,COUNT(t1.ID)FROM PARENT t0,CHILD t1 WHERE(t1.PARENT_ID = t0.ID)GROUP BY t0.ID,t0.ID
我每次都发现外键列t1.PARENT_ID
为null
。我已按以下方式更改了持久订单:
EntityManager em = dao.getEntityManager();
Parent p = new Parent();
em.persist(p);
Child a = new Child(); a.setParent(p);
Child b = new Child(); b.setParent(p);
Child c = new Child(); c.setParent(p);
em.persist(a);
em.persist(b);
em.persist(c);
然后我得到了一个结果和所需的输出:
651
3