2009-08-28 576 views
32

DISTINCT在JPA中使用了哪些列,是否可以更改它?在JPA中使用DISTINCT

下面是使用DISTINCT的例子JPA查詢:

select DISTINCT c from Customer c 

不使有很大的意義 - 什麼樣的列是不同的基礎上?它是否在實體上被指定爲註釋,因爲我找不到一個?

我想指定列作上的區別,是這樣的:

select DISTINCT(c.name) c from Customer c 

我使用的MySQL和Hibernate。

回答

5

更新:請參閱最高票數的答案。

我自己目前已經過時。由於歷史原因,只保留在這裏。


在HQL鮮明通常需要在你自己喜歡簡單的例子,聯接和不。

參見How do you create a Distinct query in HQL

+10

沒有冒犯,但是怎麼會被接受爲答案呢? – 2015-07-16 11:00:46

+3

也許是因爲這是唯一的答案:-)從2009年到2012年? – kazanaki 2015-07-16 13:05:33

+0

這是一個我沒有考慮過的有效點。我很高興現在是可行的。 – 2015-07-16 14:19:47

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 2016-12-20 07:52:37

+0

@cen - 你要求的是不合邏輯的。如果我有兩個客戶(id = 1234,name =「Joe Customer」)和(id = 2345,name =「Joe Customer」),應該爲哪種查詢返回?結果將是不確定的。現在,你可以用類似的東西來強制它(不太清楚這樣的語法是如何工作的,但是這應該給出一般的想法):'從客戶c選擇c,其中id在(從客戶d選擇min(d.id) group by d.name)'......但這是一種依賴於情況的情況,因爲您需要根據可用於選擇某個實體的屬性來提出一種方法。 – Jules 2018-02-14 21:00:32

+0

@Jules - 在這種情況下,您通常不會關心哪個返回,因此任何選擇技術都可以。我認爲MySQL甚至默認處理這種情況。我不記得我2年前的確切用例。 – cen 2018-02-15 11:39:24

6

我同意kazanaki的答案,這幫助了我。 我想選擇整個實體,所以我用

select DISTINCT(c) from Customer c 

在我來說,我有很多一對多的關係,我想在一個查詢與收藏加載實體。

我用了LEFT JOIN FETCH,最後我不得不做出不同的結果。