2016-07-07 148 views
0

考虑以下情形:两个数据库表(生产者和生产者),具有一对多关系(一个生产者由一个生产者创建,一个生产者具有多个产品),每个表具有多个字段包括名称和ID)。HQL - 选择嵌套对象

此外,考虑我有两个管理实体(生产者和产品)和这些对象(非托管)用作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 ...

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

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

谢谢!

回答

1

完整的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. 您不能使用空构造函数。
  2. 每个参数可以是single_valued_path_expressionaggregate_expression

此外,constructor_expression只存在于select_expression可以只用作顶级查询结构,让每标准JPQL你不能做嵌套select ...陈述技巧。我无法在网上找到完整的HQL规范,所以不太确定。