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
所以这基本上意味着
- 您不能使用 null 构造函数。
- 每个参数可以是
single_valued_path_expression
或aggregate_expression
。
此外,constructor_expression
仅存在于 select_expression
中,只能用作顶级查询构造,因此根据标准 JPQL,您不能使用嵌套 select ...
声明。我在网上找不到完整的 HQL 规范,所以不太确定。
考虑以下场景:两个数据库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
所以这基本上意味着
- 您不能使用 null 构造函数。
- 每个参数可以是
single_valued_path_expression
或aggregate_expression
。
此外,constructor_expression
仅存在于 select_expression
中,只能用作顶级查询构造,因此根据标准 JPQL,您不能使用嵌套 select ...
声明。我在网上找不到完整的 HQL 规范,所以不太确定。