2010-03-12 42 views
5

Ví dụ nếu tôi làm điều gì đó như:Làm cách nào để xóa tiêu chí khỏi tiêu chí?

Criteria c = session.createCriteria(Book.class) 
      .add(Expression.ge("release",reDate); 
      .add(Expression.ge("price",price); 
      .addOrder(Order.asc("date")) 
      .setFirstResult(0) 
      .setMaxResults(10); 
c.list(); 

Làm thế nào tôi có thể sử dụng các tiêu chí dụ tương tự, nhưng loại bỏ (ví dụ) các tiêu chí thứ hai? Tôi đang cố gắng tạo truy vấn động trong đó tôi muốn cho phép người dùng xóa bộ lọc mà không có chương trình phụ trợ phải tạo lại tiêu chí từ đầu.

Cảm ơn bạn

Trả lời

6

Theo như tôi biết, không có cách nào để loại bỏ mọi thứ (hạn chế, đặt hàng, vv) từ truy vấn tiêu chí, một khi bạn tạo ra nó. Tôi không đủ hiểu biết về nội bộ của API tiêu chí, nhưng tôi biết không có gì trong giao diện tiếp xúc. Bạn có thể thử thao tác các đối tượng mà bạn đang chuyển đến add hoặc addOrder, nhưng điều đó nghe có vẻ giống nhiều công việc hơn là giá trị, đặc biệt khi có các lựa chọn thay thế sạch hơn.

Truy vấn tiêu chí chắc chắn là sử dụng một lần trong mọi ứng dụng tôi đã xem.

Bây giờ, những gì bạn có thể làm là lưu trữ các hạn chế, đặt hàng và giới hạn của bạn ở định dạng tùy chỉnh (ví dụ: Collection) và sau đó tạo truy vấn của bạn dễ dàng từ định dạng được lưu trữ đó. Điều này có lẽ sẽ có ý nghĩa hơn đối với giao diện người dùng của bạn vì bạn chắc chắn cần kiểm soát chi tiết từ đó.

Không phải câu trả lời bạn đang tìm kiếm, tôi chắc chắn, nhưng đó chính xác là những gì tôi đã làm trong quá khứ.

HTH

1

Làm thế nào tôi có thể sử dụng các tiêu chí dụ tương tự, nhưng loại bỏ (ví dụ) các tiêu chí thứ hai? Tôi đang cố gắng xây dựng một truy vấn động, trong đó tôi muốn cho phép người dùng loại bỏ một bộ lọc, mà không có phần phụ trợ phải xây dựng lại các tiêu chí từ đầu.

Bạn không thể, bạn sẽ phải gửi lại toàn bộ (các) thông số được sử dụng để tạo truy vấn động.

0

Bạn có thể loại bỏ các tiêu chí theo cách này:

public static void List<CriterionType> removeCriterions(Criteria criteria, Class<? extends Criterion> type) { 
    Iterator<CriterionEntry> criterionIterator = ((CriteriaImpl) criteria).iterateExpressionEntries(); 
    while (criterionIterator.hasNext()) { 
     CriterionEntry criterionEntry = criterionIterator.next(); 
     if (criterionEntry.getCriteria() == criteria) { 
      Criterion criterion = criterionEntry.getCriterion(); 
      if (null == type || criterion.getClass() == type) { 
       criterionIterator.remove(); 
      } 
     } 
    } 
} 
Các vấn đề liên quan