2012-12-21 19 views
10

Tôi muốn viết truy vấn tiêu chí bằng cách sử dụng "nhóm theo" và muốn trả về tất cả các cột.chọn "tất cả các cột" với "nhóm theo" trong truy vấn tiêu chuẩn ngủ đông

Plane sql là như thế này:

select * from Tab group by client_name order by creation_time; 

Tôi hiểu rằng nó sẽ có count(distinct client_name) số hàng.

truy vấn hiện tại của tôi mà dường như không cho kết quả đúng là như sau:

Criteria criteria = getSession(requestType).createCriteria(Tab.class); 
     criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name"))); 
     criteria.addOrder(Order.asc("creationTime")); 

Truy vấn này chỉ trả về "client_name". Tôi không muốn đặt tất cả các tên cột theo cách thủ công. Phải có cách nào đó, có thể làm gì?

+0

Kiểm tra liên kết này: http://stackoverflow.com/questions/6678216/hibernate-select-all-projections-group-by – maximilianus

Trả lời

1

Tôi nghĩ bạn hiểu nhầm điều gì đó. Nếu bạn GROUP BY trong SQL, thì bạn cần nhóm theo tất cả các cột đã chọn. Điều tương tự cũng áp dụng cho Hibernate - nếu bạn groupProperty trong một Projection, bạn đang nói Hibernate rằng cột đó là một cột nhóm. Nếu không có cột/trường nào khác được tham chiếu, Hibernate sẽ cho rằng bạn không muốn chúng, vì chúng cũng cần được nhóm lại.

Để lùi lại một bước: bạn đang cố gắng làm gì? Nếu bạn có dữ liệu trùng lặp trên tất cả các cột trong một bảng, bạn có thể có dữ liệu xấu hoặc đang lưu giữ dữ liệu không chính xác. Ít nhất, chìa khóa của bạn sẽ bị rối tung lên.

0

Trong chế độ ngủ đông cho phép chiếu, tất cả các cột bắt buộc phải được thêm vào danh sách chiếu. Để có được kết quả trong thực thể, chúng ta phải sử dụng setResultTransformer. Kiểm tra ví dụ bên dưới để nhóm theo kiểu ngủ đông:

ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
0

khi sử dụng phép chiếu ngủ đông, bạn nên thêm tất cả các cột cần thiết vào danh sách dự. bạn chỉ sử dụng Projections.projectionList(). add (Projections.groupProperty ("client_name"))

này. vì vậy rõ ràng là chỉ trả về client_name.