java - HQL - 选择嵌套对象

标签 java hql

考虑以下场景:两个数据库表(生产者和产品),具有一对多关系(一个产品由一个生产者创建,一个生产者有多个产品),每个表具有多个字段(包括名称和 ID) .

此外,考虑到我有两个托管实体(Producer 和 Produce)以及这些对象的两个较小版本(非托管),用作仅具有名称和 ID(以及关系)的 DTO(ProducerDTO 和 ProduceDTO)。

我想使用 HQL 查询来选择特定产品(作为 DTO)及其生产者集。更清楚: SELECT new ProduceDTO(product.id, new ProducerDTO( Producer.id, Producer.name), Produce.name) FROM Produce Produce JOIN Produce. Producer 生产者 WHERE ...

但是我在查询中的 product.id 之后收到一个 QuerySyntaxException: Unexpected token: , 。所以我的问题是:是否可以在 HQL 中选择嵌套的自定义对象,如果可以,其规则/限制是什么?对于单个自定义对象,它工作得很好,但是当我尝试嵌套 2 个或更多时,我遇到了问题。

注意:问题是为了更好地理解这种现象,不一定是针对这种特定情况(我已经通过实际类(class)找到了针对我的情况的解决方法)。

谢谢!

最佳答案

完整的 JPA 查询语言语法规范可以在官方 Java EE 7 文档中找到:http://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage005.htm#BNBUF

具体来说,回答您问题的部分是:

constructor_expression ::= NEW constructor_name(constructor_item {, constructor_item}*)

constructor_item ::= single_valued_path_expression
                   | aggregate_expression

所以这基本上意味着

  1. 不能使用 null 构造函数。
  2. 每个参数可以是 single_valued_pa​​th_expressionaggregate_expression

此外,constructor_expression 仅出现在 select_expression 中,只能用作顶级查询构造,因此根据标准 JPQL,您无法使用嵌套进行技巧select ... 语句。我在网上找不到 HQL 的完整规范,所以不确定。

关于java - HQL - 选择嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38241377/

相关文章:

java - 使用编译时环境变量配置 RestApplicationPath

java - 计算链表中的所有节点

c# - 使用 HQL 语句按 ID 列表删除多条记录

java - 在字符串上启用 intelliJ Hibernate HQL 代码帮助

hibernate - 是否可以在 HQL 中覆盖 Hibernate 的 'like' 运算符?

SQL:表到键值表

Java 8 字符串垃圾收集

java - 在chrome不弹出窗口的情况下更改下载目录

java - 机器人为什么要不停地运转?是否陷入了循环?

java - HQL 查询中出现意外 token 错误