HQL - Select 嵌套对象

HQL - Select nested objects

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

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

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

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

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

谢谢!

完整的 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_path_expressionaggregate_expression

此外,constructor_expression 仅存在于 select_expression 中,只能用作顶级查询构造,因此根据标准 JPQL,您不能使用嵌套 select ... 声明。我在网上找不到完整的 HQL 规范,所以不太确定。