HQL - 选择嵌套对象

时间:2016-07-07 09:00:51

标签: java hql

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

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分: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
  3. 此外,constructor_expression仅存在于select_expression中,只能用作顶级查询构造,因此根据标准JPQL,您无法使用嵌套的select ...语句进行操作。我在网上找不到完整的HQL规范,所以不确定那个。