JPQL 构造函数表达式中的 JPQL 和子查询
Posted
技术标签:
【中文标题】JPQL 构造函数表达式中的 JPQL 和子查询【英文标题】:JPQL and sub-query in JPQL constructor expressions 【发布时间】:2013-11-16 10:55:54 【问题描述】:我有一个表 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 和 setterJPQL:
选择 新的 plop.RootExtended(r, (选择 计数(c.id) 从 孩子作为 c 在哪里 c.rootId = r.id ) ) 从 根为 r有什么想法吗?
【问题讨论】:
请提供更多的堆栈跟踪,因为重要的部分没有显示。RootExtended
是一个实体吗?
同时检查您的RootExtended
类是否接收到 Long 作为第二个参数。
@AndreiI 不,这不是实体,我已经添加了类代码
@GabrielCâmara 我尝试了十几种类型 int、long Integer、Long、Number、Object 等,但没有任何效果:(
我真的想要更多的堆栈跟踪/异常,而不是代码。
【参考方案1】:
我认为您不允许在 JPA 的 SELECT
部分中使用子查询(至少版本this。
作为解决方案,您可以进行两个查询,第二个是创建 COUNT()
并将其在代码中加载到您的 ExtendedRoot
实例中。
【讨论】:
【参考方案2】:类:
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 )
【讨论】:
我认为这行不通,因为您也不允许在FROM
子句中使用子查询。查看相同的链接。
你用什么样的魔法让它起作用......它看起来不像任何*QL以上是关于JPQL 构造函数表达式中的 JPQL 和子查询的主要内容,如果未能解决你的问题,请参考以下文章
JPQL 构造函数表达式 - org.hibernate.hql.ast.QuerySyntaxException:表未映射