【问题标题】:JPQL and sub-query in JPQL constructor expressionsJPQL 构造函数表达式中的 JPQL 和子查询
【发布时间】: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 等,但没有任何效果:(
  • 我真的想要更多的堆栈跟踪/异常,而不是代码。

标签: sql hibernate jpa jpql


【解决方案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
    猜你喜欢
    • 2018-09-03
    • 2019-07-26
    • 2012-08-29
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多