2009-08-28 8 views
32

Mit welcher Spalte arbeitet DISTINCT in JPA und ist es möglich, sie zu ändern?Verwenden von DISTINCT in JPA

Hier ist ein Beispiel JPA Query DISTINCT:

select DISTINCT c from Customer c 

Was nicht viel Sinn macht - welche Spalte die verschieden ist zu Grunde? Wird es in der Entität als Anmerkung angegeben, weil ich keine finden konnte?

Ich möchte die Spalte angeben, auf die Unterscheidung zu machen, so etwas wie:

select DISTINCT(c.name) c from Customer c 

ich mySQL und Hibernate bin mit.

Antwort

5

Update: Siehe die Antwort mit der höchsten Wahl bitte.

Meine eigene ist derzeit veraltet. Nur hier aus historischen Gründen aufbewahrt.


Distinct in HQL benötigt in der Regel in Joins und nicht in einfachen Beispielen wie die eigene.

Siehe auch How do you create a Distinct query in HQL

+10

Nichts für ungut, aber wie könnte das jemals als Antwort akzeptiert werden? –

+3

Vielleicht, weil es die einzige Antwort war :-) von 2009 bis 2012? – kazanaki

+0

das ist ein gültiger Punkt, den ich nicht berücksichtigt habe. Ich bin froh, dass es jetzt machbar ist. –

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

Sie nah sind.

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

beziehen Dies liefert nur ein Array dieser Spalte obwohl. Wie können ganze Entitäten mit diesem Ansatz zurückgegeben werden? – cen

+0

@cen - was du verlangst ist nicht logisch. Wenn ich zwei Kunden habe (id = 1234, name = "Joe Customer") und (id = 2345, name = "Joe Customer"), was sollte für solch eine Anfrage zurückgegeben werden? Die Ergebnisse wären undefiniert.Nun könntest du es mit etwas Ähnlichem erzwingen (nicht sicher, wie die Syntax dafür funktionieren würde, aber dies sollte die allgemeine Idee ergeben): Wähle c von Kunde c wo id in (wähle min (d.id) von Kunde d) Gruppieren nach D.name) '... aber das ist abhängig von der Situation, da Sie einen Weg finden müssen, basierend auf den Attributen, die Sie zur Auswahl einer Entität zur Verfügung haben. – Jules

+0

@Jules - in Fällen wie diesem ist es normalerweise egal, welches zurückgegeben wird, daher ist jede Auswahlmethode in Ordnung. Ich denke, dass mysql dieses Szenario sogar standardmäßig behandelt. Ich erinnere mich nicht an den genauen Anwendungsfall, den ich vor zwei Jahren hatte. – cen

6

Ich stimme mit kazanaki ‚s Antwort, und es hat mir geholfen. Ich wollte die ganze Einheit wählen, so habe ich

select DISTINCT(c) from Customer c 

In meinem Fall habe ich viele-zu-viele-Beziehung, und ich möchte Entitäten in einer Abfrage mit Sammlungen laden.

Ich habe LEFT JOIN FETCH verwendet und am Ende musste ich das Ergebnis deutlich machen.

Verwandte Themen