2009-08-28 577 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,最后我不得不做出不同的结果。