2016-07-07 192 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規範,所以不太確定。