2009-08-28 12 views
32

¿Con qué columna trabaja DISTINCT en JPA y es posible cambiarla?Usando DISTINCT en JPA

He aquí un ejemplo de consulta JPA utilizando distintas:

select DISTINCT c from Customer c 

lo cual no tiene mucho sentido - lo que la columna es el propio basado en? ¿Está especificado en la Entidad como una anotación porque no pude encontrar uno?

me gustaría especificar la columna de hacer la distinción, algo así como:

select DISTINCT(c.name) c from Customer c 

estoy usando MySQL y Hibernate.

Respuesta

5

Actualización: Consulte la respuesta más votados por favor.

Mi cuenta está actualmente obsoleta. Solo se guarda aquí por razones históricas.


distinto en HQL Generalmente, se necesitan en une y no en ejemplos simples como el suyo propio.

Ver también How do you create a Distinct query in HQL

+10

Sin ánimo de ofender, pero ¿cómo podría aceptarse esto como una respuesta? –

+3

Tal vez porque fue la única respuesta :-) desde 2009 hasta 2012? – kazanaki

+0

ese es un punto válido que no consideré. Me alegro de que sea factible ahora. –

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

Usted está cerca.

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

Sin embargo, esto solo devuelve una matriz de esa columna. ¿Cómo devolver entidades enteras con este enfoque? – cen

+0

@cen - lo que estás pidiendo no es lógico. Si tengo dos clientes (id = 1234, name = "Joe Customer") y (id = 2345, name = "Joe Customer"), ¿cuál debería devolverse para dicha consulta? Los resultados no estarían definidos.Ahora, podría forzarlo con algo así como (no estoy seguro cómo funcionaría la sintaxis para esto, pero esto debería dar la idea general): 'seleccione c del Cliente c donde ingrese id (seleccione min (d.id) del Cliente d group by d.name) '... pero eso depende de la situación, porque necesitas encontrar un camino basado en los atributos que tienes disponibles para seleccionar una de las entidades. – Jules

+0

@Jules: en casos como este, normalmente no te importa cuál se devuelve, por lo que cualquier técnica de elección es correcta. Creo que mysql incluso maneja este escenario de manera predeterminada. No recuerdo el caso de uso exacto que tuve hace 2 años aunque. – cen

6

Estoy de acuerdo con kazanaki 's respuesta, y me ayudó. quería para seleccionar toda la entidad, por lo que se utiliza

select DISTINCT(c) from Customer c 

En mi caso tengo relación de muchos a muchos, y yo quiero cargar entidades con las colecciones en una sola consulta.

Usé LEFT JOIN FETCH y al final tuve que hacer el resultado distinto.