2009-08-28 16 views
32

In quale colonna funziona DISTINCT in JPA ed è possibile modificarlo?Utilizzo di DISTINCT in JPA

Ecco un esempio di query JPA utilizzando distinte:

select DISTINCT c from Customer c 

che non ha molto senso - quale colonna è il distinto basato su? È specificato sull'entità come annotazione perché non è stato possibile trovarne uno?

Vorrei specificare la colonna per fare la distinzione, qualcosa come:

select DISTINCT(c.name) c from Customer c 

Sto usando MySQL e Hibernate.

risposta

5

Aggiornamento: vedere la risposta più votata per favore.

Il mio è attualmente obsoleto. Solo tenuto qui per ragioni storiche.


Distinti in HQL è di solito necessario in unisce e non a semplici esempi come la vostra.

Vedi anche How do you create a Distinct query in HQL

+10

Senza offesa, ma come mai questo può essere accettato come risposta? –

+3

Forse perché era l'unica risposta :-) dal 2009 fino al 2012? – kazanaki

+0

questo è un punto valido che non ho considerato. Sono contento che sia fattibile ora. –

11
@Entity 
@NamedQuery(name = "Customer.listUniqueNames", 
      query = "SELECT DISTINCT c.name FROM Customer c") 
public class Customer { 
     ... 

     private String name; 

     public static List<String> listUniqueNames() { 
      return = getEntityManager().createNamedQuery(
        "Customer.listUniqueNames", String.class) 
        .getResultList(); 
     } 
} 
43

Vi sono vicino.

select DISTINCT(c.name) from Customer c 
+10

Questo però restituisce solo una matrice di quella colonna. Come restituire intere entità con questo approccio? – cen

+0

@cen: quello che chiedi non è logico. Se ho due clienti (id = 1234, name = "Joe Customer") e (id = 2345, name = "Joe Customer"), che deve essere restituito per tale query? I risultati sarebbero indefiniti.Ora potresti forzarlo con qualcosa di simile (non sono sicuro di come funzionerebbe la sintassi, ma questo dovrebbe dare l'idea generale): 'seleziona c dal Cliente c dove id in (seleziona min (d.id) dal Cliente d raggruppa per d.name) '... ma questa è una situazione dipendente, perché devi trovare un modo basato su quali attributi hai a disposizione per selezionare una delle entità. – Jules

+0

@Jules: in casi come questo di solito non ti interessa quale viene restituito, quindi qualsiasi tecnica di scelta è ok. Penso che mysql gestisca anche questo scenario di default. Non ricordo l'esatto caso d'uso che ho avuto 2 anni fa. – cen

6

Sono d'accordo con s' kazanaki risposta, e mi ha aiutato. ho voluto selezionare l'intera entità, così ho usato

select DISTINCT(c) from Customer c 

Nel mio caso ho molti-a-molti, e voglio caricare le entità con le collezioni in una query.

Ho usato LEFT JOIN FETCH e alla fine ho dovuto rendere il risultato distinto.