2009-08-28 16 views
32

DISTINCT hangi sütunu JPA ile çalışır ve değiştirmek mümkün müdür?DISTINCT öğesini JPA içinde kullanma

İşte DISTINCT kullanıldığı bir örnek JPA sorgu var:

select DISTINCT c from Customer c 

anlamda çok yapmaz - ayrı sütunun neyi temel alır? Varlık üzerinde bir açıklama olarak belirtildi, çünkü bulamadım mı? Ben mySQL ve Hibernate kullanıyorum

select DISTINCT(c.name) c from Customer c 

:

Ben gibi bir şey üzerinde ayrım yapmak için sütun belirtmek isteriz.

cevap

5

Güncelleme: En yüksek oyu yanıta bakın lütfen. Kendi

anda kullanılmıyor. Sadece tarihi nedenlerle burada tutulur. Kendi gibi basit örneklerde Katıldı değil de HQL içinde Farklı


genellikle gereklidir.

da How do you create a Distinct query in HQL

+10

Suçlama yok, ama bu nasıl bir cevap olarak kabul edilebilir? –

+3

Belki de 2009'dan 2012'ye kadar tek cevap :-) olduğu için? – kazanaki

+0

, dikkate almadığım geçerli bir nokta. Şimdi yapabildiğine sevindim. –

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

Sen yakındır bakın.

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

Bu, yalnızca bu sütunun bir dizisini döndürür. Bütün yaklaşımları bu yaklaşımla nasıl iade edebilirim? – cen

+0

@cen - sizin için ne soruyor mantıklı değil. İki müşterim varsa (id = 1234, isim = "Joe Müşteri") ve (id = 2345, isim = "Joe Müşteri"), bu tür bir sorgu için geri gönderilmeli? Sonuçlar undefined olacaktır.Şimdi, bunun gibi bir şeyle zorlayabilirsiniz (tam olarak bunun sözdizimi nasıl çalışacaklarından emin değilsiniz, fakat bu genel fikri vermelidir): 'c'deki Müşteri c'yi seçin (burada min (d.id) seçeneğini Müşteri d dan seçin d.name ile gruplandır ... '... ama bu duruma bağlı, çünkü varlıklardan birini seçmek için sahip olduğunuz özelliklere dayanarak bir yol bulmanız gerekiyor. – Jules

+0

@Jules - bu gibi durumlarda genellikle hangisinin döndüğünü umursamıyorsunuz, böylece herhangi bir seçme tekniği iyi. Bence mysql bu senaryoyu varsayılan olarak bile kullanmaktadır. 2 yıl önce, tam olarak kullandığım davayı hatırlamıyorum. – cen

6

Ben kazanaki 'ın yanıta katılabilir ve bu bana yardımcı oldu. Ben bütün varlığı seçin istedi, bu yüzden ben çok-çok ilişki var ve ben tek sorguda koleksiyonları ile varlıkları yüklemek istediğiniz Benim durumumda

select DISTINCT(c) from Customer c 

kullandı.

Ben FETCH JOIN SOL kullanılan ve sonunda ben sonuç farklı yapmak zorunda kaldı.

İlgili konular