1

我有一个表 ROOT 和一个表 CHILDREN,其中包含与 ROOT 相关的行。

我想为 ROOT 的每一行检索一个对象,该对象包含 ROOT 对象以及 CHILDREN 表中与 ROOT.id 相关的行数。

这可以在 SQL 中很容易地实现,但我想知道如何在 JPQL 中编写它

在 SQL 中:

选择
    r.*,
    (选择计数(c.i_id)
     从
        儿童 c
    在哪里
        c.rootId = r.id)
从根 r;

我试图在 JPA 中重写它,但它一直失败并出现以下错误

Caused by: org.hibernate.HibernateException: Errors in named queries: xxx
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate 
           appropriate constructor on class RootExtended...

Java类:

包扑通一声;

公共类 RootExtended{

    私有根根;

    私人长计数;

    public RootExtended(final Root root, final Long count) {
        这个.root=根;
        this.count=计数;
    }

    // 要遵循的 getter 和 setter
}

JPQL:

选择
    新的 plop.RootExtended(r,
                    (选择
                         计数(c.id)
                     从
                         孩子作为 c
                     在哪里
                         c.rootId = r.id
                     )
                    )
从
    根为 r

任何想法 ?

4

2 回答 2

0

班级 :

public class RootExtended{

private Root root;

private Long count;

public RootExtended(final Root root, final Long count) {
    this.root= root;
    this.count= count;
}

// getters and setters to follow
}

询问 :

SELECT NEW package.RootExtended ( rt.r, rt.cnt) from ( select r from Root r, 
      (SELECT count(c.id) as cnt FROM Child c  WHERE  c.rootId = r.id ) rt )
于 2013-11-05T15:13:58.607 回答
0

我认为您不允许SELECT在 JPA 的部分中使用子查询(至少 version<=2),因为它们仅限于 WHERE 和 HAVING 子句。有关详细信息,请参阅

作为解决方案,您可以进行两个查询,在第二个中进行查询COUNT()并将其加载到您的ExtendedRoot实例的代码中。

于 2013-11-05T15:08:09.353 回答