Vraag DISTINCT gebruiken in JPA


In welke kolom werkt DISTINCT in JPA en is het mogelijk om dit te wijzigen?

Hier is een voorbeeld van een JPA-query met DISTINCT:

select DISTINCT c from Customer c

Wat niet erg logisch is - op welke kolom staat het onderscheid gebaseerd? Is dit opgegeven op de entiteit als annotatie omdat ik er geen kon vinden?

Ik zou de kolom willen specificeren om het onderscheid op te maken, zoiets als:

select DISTINCT(c.name) c from Customer c

Ik gebruik mySQL en Hibernate.


36
2017-08-28 10:31


oorsprong


antwoorden:


Update: zie alstublieft het best goedgekeurde antwoord.

De mijne is momenteel verouderd. Alleen hier bewaard om historische redenen.


Distinct in HQL is meestal nodig in Joins en niet in eenvoudige voorbeelden zoals die van jou.

Zie ook Hoe creëer je een onderscheidende vraag in HQL


7
2017-08-28 15:40



Je bent dichtbij.

select DISTINCT(c.name) from Customer c

48
2017-10-24 13:58



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

12
2017-08-28 22:44



Ik ben het eens met kazanaki's antwoord, en het heeft me geholpen. Ik wilde de hele entiteit selecteren, dus ik gebruikte

 select DISTINCT(c) from Customer c

In mijn geval heb ik een veel-op-veel-relatie en ik wil entiteiten met verzamelingen in één query laden.

Ik gebruikte LINKER JOIN FETCH en aan het eind moest ik het resultaat onderscheiden.


9
2017-10-19 15:45



Ik zou de constructor-expressiefunctie van JPA gebruiken. Zie ook het volgende antwoord:

JPQL Constructor Expression - org.hibernate.hql.ast.QuerySyntaxException: tabel is niet toegewezen

Volgens het voorbeeld in de vraag zou het zoiets zijn als dit.

SELECT DISTINCT new com.mypackage.MyNameType(c.name) from Customer c

1
2018-06-29 06:32