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 和 setter

JPQL:

选择 新的 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 和子查询的主要内容,如果未能解决你的问题,请参考以下文章

IN 表达式中的 JPQL LOWER 函数

java 使用JPQL投影进行查询(需要使用构造函数)

使用构造函数表达式和 JPQL 的复合 DTO 投影

JPQL 构造函数表达式 - org.hibernate.hql.ast.QuerySyntaxException:表未映射

正确的表达式不是 JPQL/HQL 查询中的有效表达式

JPQL 构造函数忽略具有 NULL 值的行