2015-10-28 6 views
9

Gibt es eine Möglichkeit, mehrere SELECT NEW Anweisungen in einer jpql Abfrage (Hibernate) zu haben?jpa Konstruktor Ausdrücke mit mehreren SELECT NEW Anweisungen

Dies funktioniert für mich:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r) " 
     +" FROM Item g, Service s, Service l , Service r" 
     +" WHERE s.id = g.id" 
     +" AND s.location = l.name" 
     +" AND s.serviceType = 'type'" 
     +" AND l.serviceType = 'Location'" 
     +" AND l.area = r.name" 
     +" AND r.serviceType = 'Region'") 
public List<Item> getAllItemsWithServices(); 

ich das erwartete Ergebnis in meinem DTO bekommen.

@Component 
public class ItemServiceDTO{ 

    private Item item; 
    private Service serviceType; 
    private Service serviceLocation; 
    private Service serviceRegion; 

    public ItemServiceDTO(item item, Service serviceType, Service serviceLocation, Service serviceRegion) { 
     super(); 
     this.item = item; 
     this.serviceType = serviceType; 
     this.serviceLocation = serviceLocation; 
     this.serviceRegion = serviceRegion; 
    } 

Aber was ich will, ist eine neue Instanz von Language mit seinem contructor zu haben.

Zum Beispiel wie folgt aus:

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r), new LanguageDTO()" 
      +" FROM Item g, Service s, Service l , Service r" 

Oder in einem subselect von ItemService

@Query("SELECT NEW com.test.project.dto.ItemService(g,s,l,r, new LanguageDTO())" 
       +" FROM Item g, Service s, Service l , Service r" 

ich interessiert auch bei der Verwendung Map und List in meine DTO Objekte aber ich lese das ist nicht möglich? Ist das richtig?

Meine Spring-Boot-Anwendung beginnt mit Fehlern, während Sie die beiden Beispiele verwenden.

Am Ende möchte ich eine Karte von Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

Was ist Ihr JPA-Anbieter (d. H. EclipseLink, Hibernate)? – Ish

+0

Entschuldigung, sein Hibernate – Patrick

+0

hallo. Ich versuche, den neuen Operator zu verwenden, aber wenig Ressourcen zu finden. Frage: Erstellen Sie eine jpa-Repo-Schnittstelle und platzieren Sie diese Anweisung: public List getAllItemsWithServices(); dass dieses Repo? Ein Beispiel oder ein Verweis auf ein vollständiges Beispiel würde sehr geschätzt werden. Vielen Dank – jscriptor

Antwort

11

Technisch durch Definition von JPQL select-Klausel, würde es mehrere Konstruktor Ausdrücke ermöglichen.

  • select_clause :: = SELECT [DISTINCT] select_ausdruck {, select_ausdruck} *
  • select_ausdruck :: = single_valued_path_expression | Aggregatausdruck | identification_variable |
    OBJEKT (identification_variable) | constructor_expression
  • constructor_Ausdruck :: = NEU constructor_name (Konstruktor_Element {, Konstruktor_Element} *)
  • constructor_item :: = single_valued_path_expression | aggregate_expression
  • aggregate_ausdruck :: = {AVG | MAX | MIN | SUM} ([DISTINCT] state_field_path_ausdruck) | COUNT ([DISTINCT]
    identification_variable | state_field_path_expression |
    single_valued_association_path_expression)

Beispiel:

SELECT NEW com.test.model.UserName(u.firstname, u.lastname), NEW com.test.model.UserEmail(u.email) FROM User u 

Allerdings habe ich gerade entdeckt, dass Hibernate es nicht gestattet. Wenn ich JPA-Provider von Hibernate zu EclipseLink wechselte, funktioniert es. Daher müssen Sie möglicherweise Ihren Provider konsultieren, wenn eine solche Abfragesyntax zulässig ist.

Beachten Sie jedoch, dass Ihr Konstruktor bei Verwendung des NEW-Operators Argumente (mindestens eine) haben muss.Also dieser Ausdruck wird nicht funktionieren:

SELECT NEW LanguageDTO() 

Zu Ihrer zweiten Frage, ob es möglich ist List und Map zu verwenden, ich bin ganz verwirrt, wie Sie diese Sammlungen in Ihrer Abfrage verwenden wollen. Beachten Sie jedoch, dass in der SELECT-Klausel nach der Definition von JPQL SELECT_CLAUSE keine Pfadausdrücke mit Auflistungswerten vorhanden sein können.

Verwandte Themen