2009-08-28 13 views
32

Jaką kolumnę DISTINCT obsługuje w JPA i czy można ją zmienić?Korzystanie z DISTINCT w JPA

Oto przykład JPA zapytania przy użyciu DISTINCT:

select DISTINCT c from Customer c 

który nie sprawia, że ​​wiele sensu - co kolumna jest wyraźna na podstawie? Czy jest on określony w Entity jako adnotacja, ponieważ nie mogłem go znaleźć?

chciałbym określić kolumnę wprowadzić rozróżnienie na, coś takiego:

select DISTINCT(c.name) c from Customer c 

używam MySQL i Hibernacja.

Odpowiedz

5

Aktualizacja: Zobacz odpowiedź z najwyższym udziałem.

Moje własne jest obecnie przestarzałe. Zachowane tylko tutaj z przyczyn historycznych.


Wyraźne w HQL jest zwykle potrzebne w Łączy, a nie w prostych przykładów, jak własne.

Zobacz także How do you create a Distinct query in HQL

+10

Bez urazy, ale jak to może być kiedykolwiek zaakceptowane jako odpowiedź? –

+3

Może dlatego, że była to jedyna odpowiedź :-) od 2009 do 2012? – kazanaki

+0

to ważny punkt, którego nie brałem pod uwagę. Cieszę się, że teraz można to zrobić. –

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

Jesteś blisko.

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

To tylko zwraca tablicę tej kolumny. Jak zwrócić całe jednostki za pomocą tego podejścia? – cen

+0

@cen - to, o co prosisz, nie jest logiczne. Jeśli mam dwóch klientów (id = 1234, name = "Joe Customer") i (id = 2345, name = "Joe Customer"), które powinny zostać zwrócone dla takiego zapytania? Wyniki byłyby niezdefiniowane.Teraz możesz zmusić go do czegoś podobnego (nie jestem pewien jak działa ta składnia, ale powinno to dać ogólny pogląd): 'wybierz c od Klienta c, gdzie id w (wybierz min (d.id) z Klienta d group by d.name) '... ale to zależy od sytuacji, ponieważ musisz wymyślić sposób, w oparciu o jakie atrybuty masz dostępne, aby wybrać jedną z encji. – Jules

+0

@Jules - w takich przypadkach zazwyczaj nie obchodzi cię, który z nich jest zwracany, więc każda wybrana technika jest w porządku. Myślę, że mysql domyślnie obsługuje ten scenariusz. Nie pamiętam dokładnego przypadku użycia, który miałem 2 lata temu. – cen

6

zgadzam się z kazanaki „s odpowiedzi, a bardzo mi pomógł. chciałem zaznaczyć cały podmiot, więc użyłem

select DISTINCT(c) from Customer c 

W moim przypadku mam wiele do wielu relacji i chcę, aby załadować podmioty z kolekcji w jednym zapytaniu.

Użyłem LEWEGO DOŁĄCZAĆ FETCH i na końcu musiałem zrobić wyraźny wynik.