2009-08-28 2 views
32

В каком столбце работает DISTINCT в JPA и можно ли его изменить?Использование DISTINCT в JPA

Вот пример JPA запрос с использованием DISTINCT:

select DISTINCT c from Customer c 

Что не делает много смысла - какой столбец является отчетливое основано? Указано ли это в Entity как аннотация, потому что я не мог найти его?

Я хотел бы указать столбец сделать различие на, что-то вроде:

select DISTINCT(c.name) c from Customer c 

Я использую MySQL и спящий режим.

ответ

5

Обновление: см. Проголосовавший ответ, пожалуйста.

Мое собственное в настоящее время устарело. Только хранится здесь по историческим причинам.


Distinct в HQL обычно требуется в соединениях, а не в простых примерах, как свои собственные.

Смотрите также How do you create a Distinct query in HQL

+10

Не обижайтесь, но как это можно было бы принять за ответ? –

+3

Возможно, потому что это был единственный ответ :-) с 2009 по 2012 год? – kazanaki

+0

Это действительный момент, который я не рассматривал. Я рад, что теперь это выполнимо. –

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

Вы близки.

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

Это возвращает массив этого столбца. Как вернуть все объекты с таким подходом? – cen

+0

@cen - то, о чем вы просите, нелогично. Если у меня есть два клиента (id = 1234, name = «Joe Customer») и (id = 2345, name = «Joe Customer»), которые должны быть возвращены для такого запроса? Результаты не будут определены.Теперь вы можете заставить его что-то вроде (не совсем точно, как синтаксис для этого будет работать, но это должно дать общую идею): 'select c из Customer c где id in (выберите min (d.id) из Customer d group by d.name) '... но это зависит от ситуации, потому что вам нужно найти способ, основанный на том, какие атрибуты у вас есть, чтобы выбрать один из объектов. – Jules

+0

@Jules - в подобных случаях вам, как правило, не важно, какой из них возвращен, поэтому любая техника выбора в порядке. Я думаю, что mysql даже обрабатывает этот сценарий по умолчанию. Я не помню точного варианта использования, который у меня был 2 года назад. – cen

6

Я согласен с kazanaki «s ответ, и это помогло мне. Я хотел выбрать весь объект, так что я использовал

select DISTINCT(c) from Customer c 

В моем случае у меня есть много-ко-многим, и я хочу, чтобы загрузить объекты с коллекциями в одном запросе.

Я использовал LEFT JOIN FETCH, и в конце мне пришлось сделать результат отличным.

Смежные вопросы