2015-10-28 17 views
9

Esiste un modo per avere più istruzioni SELECT NEW in una query jpql (Hibernate)?espressioni jpa constructor con più SELECT NEW statements

questo funziona per me:

@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(); 

ottengo il risultato atteso nel mio DTO.

@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; 
    } 

Ma quello che voglio è quello di avere una nuova istanza di Language con il suo contructor.

Ad esempio come questo:

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

O in una selezione secondaria di ItemService

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

Ho anche interessati ad utilizzare Map e List nei miei DTO oggetti ma ho letto quello non è possibile? È giusto?

L'applicazione di avvio Spring inizia con errori durante l'utilizzo dei due esempi.

Alla fine voglio una mappa di Map<List<Item>,Map<List<LanguageDTO>,List<ItemServiceDTO>>> map;

+0

Qual è il tuo provider JPA (ad esempio EclipseLink, Hibernate)? – Ish

+0

Ci scusiamo, il suo Hibernate – Patrick

+0

ciao. Sto cercando di usare il nuovo operatore ma trovando poche risorse. domanda: crei un'interfaccia jpa repo e inserisci questa dichiarazione: public List getAllItemsWithServices(); in quel repository? Un esempio o un riferimento a un esempio completo sarebbe molto apprezzato. Grazie – jscriptor

risposta

11

Tecnicamente, per definizione di JPQL selezionare clausola, permetterebbe molteplici espressioni costruttore.

  • select_clause :: = SELECT [DISTINCT] {select_expression, select_expression} *
  • select_expression :: = single_valued_path_expression | aggregate_expression | identification_variable |
    OBJECT (identification_variable) | constructor_expression
  • constructor_expression :: = NEW constructor_name (constructor_item {, constructor_item} *)
  • constructor_item :: = single_valued_path_expression | aggregate_expression
  • aggregate_expression :: = {AVG | MAX | MIN | SUM} ([DISTINCT] state_field_path_expression) | COUNT ([DISTINCT]
    identification_variable | state_field_path_expression |
    single_valued_association_path_expression)

Esempio:

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

Tuttavia, ho appena scoperto che Hibernate non lo consente. Quando ho cambiato il provider JPA da Hibernate a EclipseLink, funziona. Pertanto, potrebbe essere necessario consultare il fornitore se tale sintassi di query è consentita.

Prendere nota tuttavia che quando si utilizza l'operatore NEW, il costruttore deve avere argomenti (almeno uno).Quindi questa espressione non funziona:

SELECT NEW LanguageDTO() 

Sulla tua seconda domanda, se sia possibile utilizzare List e Map, sono abbastanza confuso come si desidera utilizzare queste raccolte nella query. Tuttavia, prendere nota che non è possibile avere espressioni di percorso con valori di raccolta nella clausola SELECT come da definizione di SELECT_CLAUSE JPQL.

Problemi correlati