如何正确使用JPQL SIZE()?

时间:2014-09-11 08:03:11

标签: java jpa eclipselink jpql

我无法使用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。

1 个答案:

答案 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_IDnull。我已按以下方式更改了持久订单:

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