2009-08-28 70 views
32

DISTINCT làm việc với những gì trong JPA và có thể thay đổi nó không?Sử dụng DISTINCT trong JPA

Dưới đây là một ví dụ JPA truy vấn sử dụng DISTINCT:

select DISTINCT c from Customer c 

nào không làm cho rất nhiều ý nghĩa - những gì cột là khác biệt dựa vào đâu? Có phải nó được chỉ định trên thực thể dưới dạng chú thích vì tôi không thể tìm thấy một chú thích không?

Tôi muốn để xác định cột để làm cho sự phân biệt trên, một cái gì đó như:

select DISTINCT(c.name) c from Customer c 

Tôi đang sử dụng mySQL và Hibernate.

Trả lời

5

Cập nhật: Xem câu trả lời được bầu chọn nhiều nhất.

Hiện tại tôi đã lỗi thời. Chỉ giữ ở đây vì lý do lịch sử.


Cần có sự khác biệt trong HQL trong các ví dụ đơn giản như của bạn.

Xem thêm How do you create a Distinct query in HQL

+10

Không có hành vi phạm tội, nhưng làm thế nào điều này có thể được chấp nhận làm câu trả lời? –

+3

Có lẽ vì đó là câu trả lời duy nhất :-) từ năm 2009 đến năm 2012? – kazanaki

+0

đó là điểm hợp lệ mà tôi không cân nhắc. Tôi rất vui vì nó có thể thực hiện được ngay bây giờ. –

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

Bạn đang gần.

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

Điều này chỉ trả về một mảng của cột đó. Làm thế nào để trả lại toàn bộ thực thể với cách tiếp cận này? – cen

+0

@cen - những gì bạn đang yêu cầu không hợp lý. Nếu tôi có hai khách hàng (id = 1234, name = "Joe Customer") và (id = 2345, name = "Joe Customer"), sẽ được trả lại cho truy vấn như vậy? Kết quả sẽ không xác định.Bây giờ, bạn có thể ép buộc nó với một cái gì đó như (không chắc chắn cách cú pháp này sẽ hoạt động, nhưng điều này sẽ đưa ra ý tưởng chung): 'select c từ Customer c trong đó id in (select min (d.id) từ Customer d nhóm bởi d.name) '... nhưng đó là một tình huống phụ thuộc, bởi vì bạn cần phải tìm ra một cách dựa trên những thuộc tính bạn có sẵn để chọn một trong các thực thể. – Jules

+0

@Jules - trong các trường hợp như thế này, bạn thường không thực sự quan tâm cái nào được trả về nên bất kỳ kỹ thuật chọn nào cũng được. Tôi nghĩ rằng mysql thậm chí xử lý kịch bản này theo mặc định. Tôi không nhớ trường hợp sử dụng chính xác tôi đã có 2 năm trước tho. – cen

6

Tôi đồng ý với câu trả lời kazanaki 's, và nó đã giúp tôi. tôi muốn chọn toàn bộ tổ chức nào, vì vậy tôi sử dụng

select DISTINCT(c) from Customer c 

Trong trường hợp của tôi, tôi có nhiều-nhiều mối quan hệ, và tôi muốn tải các đối tượng với bộ sưu tập trong một truy vấn.

Tôi đã sử dụng LEFT JOIN FETCH và cuối cùng tôi phải tạo kết quả riêng biệt.

Các vấn đề liên quan