2016-07-07 6 views
0

Stellen Sie sich das folgende Szenario vor: zwei Datenbanktabellen (Produzenten und Produkte), mit einer Eins-zu-Viele-Beziehung (ein Produkt wird von einem Hersteller erstellt, ein Hersteller hat viele Produkte), jede Tabelle mit mehreren Feldern (einschließlich Name und ID).HQL - Wählen Sie geschachtelte Objekte

Außerdem, ich denke, ich habe zwei verwaltete Entitäten (Producer und Produce) und zwei kleinere Versionen dieser Objekte (nicht verwaltet) als DTOs (ProducerDTO und ProduceDTO) mit nur Name und ID (und die Beziehung).

Ich möchte mit einer HQL-Abfrage ein bestimmtes Produkt (als ein DTO) mit seiner Hersteller-Set auch auswählen. Deutlicher: SELECT new ProduceDTO(produce.id, new ProducerDTO(producer.id, producer.name), produce.name) FROM Produce produce JOIN produce.producer producer WHERE ...

Aber ich bekomme ein QuerySyntaxException: unexpected token: , nach produce.id in der Abfrage. Meine Frage wäre also: Ist es möglich geschachtelte benutzerdefinierte Objekte in HQL auszuwählen und wenn ja, welche Regeln/Einschränkungen gibt es? Für ein einzelnes benutzerdefiniertes Objekt funktioniert es ganz gut, aber wenn ich versuche, die nächsten 2 oder mehr zu erreichen, habe ich Probleme.

Hinweis: Die Frage ist, das Phänomen besser zu verstehen, nicht unbedingt für diesen speziellen Fall (ich habe bereits einen Workaround für meinen Fall mit meinen tatsächlichen Klassen).

Danke!

Antwort

1

Die vollständige Syntax der Abfragesprache JPA-Spezifikation finden Sie hier im offiziellen Java EE 7 Dokumentation: http://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage005.htm#BNBUF

die Teile Insbesondere die Ihre Frage zu beantworten sind:

constructor_expression ::= NEW constructor_name(constructor_item {, constructor_item}*) 

constructor_item ::= single_valued_path_expression 
        | aggregate_expression 

dies also im Grunde bedeutet,

  1. Sie können keinen Nullkonstruktor verwenden.
  2. Jeder Parameter kann entweder single_valued_path_expression oder aggregate_expression sein.

Ferner ist constructor_expression nur in select_expression, die nur als Top-Level-Abfrage-Konstrukt verwendet werden kann, so dass pro Standard JPQL Sie nicht Tricks mit verschachtelten select ... Aussagen machen können. Ich konnte keine vollständige Spezifikation von HQL online finden, bin mir also nicht sicher.

Verwandte Themen