2010-03-03 14 views
5

Tôi có một tiêu chuẩn với:Remove động một trật tự để tập hợp kết quả trong org.hibernate.Criteria

Tuy nhiên, khi tôi muốn nhận được rowcount thất bại:

criteria.setProjection(Projections.rowCount()); 

vì có là một đơn hàng trong truy vấn.

Làm cách nào để xóa thứ tự động trong Tiêu chí?

Ý tôi là, tôi đang tìm kiếm như criteria.removeOrder("ID").

+0

Hmm ... tại sao bạn gọi 'addOrder()' nếu bạn không muốn? –

+0

@PascalThivent điểm tốt. Đôi khi bạn có thể được trả về một đối tượng Tiêu chí có thứ tự tích hợp (ví dụ: từ phương thức nhà máy) và bạn có thể muốn xóa thứ tự được xác định trước đó. Đây là lý do tại sao tôi đi vào câu hỏi này. –

Trả lời

5

Có vẻ như bạn đang cố gắng sử dụng lại Tiêu chí được thực hiện để nhận danh sách đặt hàng thay vì nhận được số lượng.

Thay vì cố gắng sử dụng cùng một Tiêu chí để truy xuất dữ liệu và để đếm, có lẽ bạn tốt nhất chỉ cần tạo Tiêu chí độc lập.

Sử dụng

Criteria orderCriteria= session.createCriteria(Libro.class) 
           .addOrder(Order.asc("ID")); 

để lấy danh sách theo thứ tự, và sử dụng

Criteria countCriteria= session.createCriteria(Libro.class) 
           .setProjection(Projections.rowCount()); 

để có được đếm.

Để sử dụng cùng một Tiêu chí cho hai mục đích, bạn phải thay đổi trạng thái giữa các tập quán. Tôi không chắc chắn làm thế nào để loại bỏ một đơn đặt hàng (hoặc nếu bạn thực sự cần để làm một số). Để xóa một phép chiếu chỉ cần setProjection(null).

0

Nếu bạn nhận được các tiêu chí như một param và bạn làm một số tính toán với nó, bạn có thể sử dụng .Clone() như ở đây:

private static int GetTotalRows(ICriteria criteria) 
    { 
     var countCriteria = (ICriteria)criteria.Clone(); 
     return Convert.ToInt32(countCriteria.SetProjection(Projections.RowCount()).UniqueResult()); 
    } 

giải pháp khác là sử dụng ClearOrders đó sẽ loại bỏ tất cả các danh sách theo thứ tự.

private static int GetTotalRows(ICriteria criteria) 
    { 
     criteria.ClearOrders(); 
     ... 
    } 

Trân

+0

'criteria.ClearOrders()' là gì ?? –

1

Tôi cũng đã phải đối mặt với cùng một vấn đề .. nhưng tôi đã đạt được theo cách sau,

Trước khi áp dụng để tôi truy vấn số lượng hồ sơ,

criteria.addOrder(pageCriteria.isSortDescending() ? Order 
          .desc(pageCriteria.getSortBy()) : Order 
          .asc(pageCriteria.getSortBy())); 

pageCriteria.setTotalRecords(((Integer) criteria 
          .setProjection(Projections.rowCount()) 
          .uniqueResult()).intValue()); 
       criteria.setProjection(null); 
       criteria.setFirstResult(
         pageCriteria.getFirstRecordOfCurrentPage()) 
         .setMaxResults(pageCriteria.getRecordsPerPage()); 
       criteria 
         .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

Đoạn mã trên hoạt động tốt cho tôi.

0

bạn không thể xóa đơn đặt hàng theo tiêu chí. giải pháp của tôi để phân trang là chuyển Lệnh [] làm tham số cho phương thức thực hiện phân trang.

bạn phải làm điều này chỉ khi db là db2 as400 hoặc cơ sở dữ liệu khác không cho phép đặt hàng trong phạm vi select count(*).

1

criteria.ClearOrders() là phương thức NHibernate được cung cấp để xóa đơn hàng.

Trong Java, không có phương pháp như vậy. Và giải pháp của tôi cho vấn đề này là sử dụng Order khi một tham số khác chuyển cùng với Criteria vào hàm truy vấn phân trang.

6

Hầu hết tiêu chí thực sự là trường hợp của CriteriaImpl. Nếu bạn đưa tiêu chí của bạn vào CriteriaImpl và nhận trình vòng lặp cho các đơn hàng, bạn có thể loại bỏ chúng theo cách đó.

Criteria criteria= session.createCriteria(Libro.class).addOrder(Order.asc("ID")); 
Iterator<Order> orderIter = ((CriteriaImpl)criteria).iterateOrderings(); 
while (orderIter.hasNext()) { 
    orderIter.next(); 
    orderIter.remove(); 
} 

Long totalRows = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult(); 
+0

là có bất kỳ iterator cho dự? Tôi có cùng một vấn đề và tôi muốn truy cập vào projectionsList của mình –