2012-02-16 60 views
5

Rất bực bội khi bạn không thể sử dụng QBE trên các liên kết.Truy vấn bằng ví dụ về các liên kết

Tôi có dữ liệu lớn với khoảng 8 cột nhiều người. Có một danh sách thả xuống cho mỗi cột để lọc bảng.

Giả sử như sau:

Bảng tài

User { id, UserStatus, UserAuthorization } 

Tôi muốn sử dụng mã này:

Criteria crit = getSession().createCriteria(class); 
crit.add(Example.create(userObject)); 

này không hoạt động trên các ví dụ sau đây userObject:

User id=1 { UserStatus=Active, UserAuthorization=Admin } 

vì QBE không hỗ trợ bộ sưu tập.

Một cách để giải quyết này là sử dụng nó theo cách này:

crit.createCriteria("UserStatus").add(Example.create(userStatusObject)); 
crit.createCriteria("UserAuthorization").add(Example.create(userAuthorizationObject)); 

Câu hỏi của tôi là như thế nào điều này có thể được lập trình tự động chỉ với trao User đối tượng. Có cách nào khác hơn là sử dụng QBE không?

+0

làm điều đó bằng tay với .add (Restriction.eq())? – Firo

+0

Tôi cố gắng tránh điều đó ... toàn bộ vấn đề đằng sau QBE là không làm mọi thứ bằng tay – rotsch

+0

tôi vừa trả lời "Có cách nào khác hơn là sử dụng QBE không?" : D – Firo

Trả lời

2

bạn có thể kết hợp QBE và những biểu hiện bình thường để xử lý những phần QBE doesnt hỗ trợ

Criteria crit = getSession().createCriteria(class); 
    .add(Example.create(userObject)); 
    .add(Expression.eq("UserStatus", userObject.getUserStatus())); 
+0

Cảm ơn bạn, có cách nào để làm cho động lực này không? – rotsch

1

Dưới đây là một câu trả lời chung chung mà tôi tìm thấy làm việc cho tôi bên trong của cơ sở kho của tôi, sử dụng phản ánh:

protected T GetByExample(T example) 
{ 
    var c = DetachedCriteria.For<T>().Add(Example.Create(example).ExcludeNone()); 
    var props = typeof (T).GetProperties() 
     .Where(p => p.PropertyType.GetInterfaces().Contains(typeof(IEntityBase))); 
    foreach (var pInfo in props) 
    { 
     c.Add(Restrictions.Eq(pInfo.Name, pInfo.GetValue(example))); 
    } 
    return Query(c); 
} 

Lưu ý rằng tất cả các thực thể của tôi kế thừa từ IEntityBase, cho phép tôi chỉ tìm những tham chiếu khóa ngoài từ thuộc tính đối tượng để tôi có thể thêm chúng vào tiêu chí. Bạn sẽ phải cung cấp một số cách để thực thi truy vấn (ví dụ: c.GetExecutableCriteria (Session))

0

Đây là mã có thể được sử dụng cho mọi thực thể sử dụng truy vấn theo ví dụ trong chế độ ngủ đông.

/** 
       * This method will use for query by example with association 
       * @param exampleInstance the persistent class(T) object 
       * @param restrictPropertyName the string object contains the field name of the association 
       * @param restrictPropertyValue the association object 
       * @return list the persistent class list 
       */ 
public List<T> queryByExampleWithRestriction(T exampleInstance, String restrictPropertyName, Object restrictPropertyValue) { 
      log.info("Inside queryByExampleWithRestriction method of GenericHibernateDAO"); 
      List<T> list = null; 
      try { 
       Criteria criteria = getSession().createCriteria(exampleInstance.getClass()); 
       Example example = Example.create(exampleInstance); 
       criteria.add(example); 
       criteria.add(Restrictions.eq(restrictPropertyName, restrictPropertyValue)); 
       list = criteria.list(); 
       log.info("Executed the queryByExampleWithRestriction query with criteria successfully!"); 
      } catch(HibernateException e){ 
       throw (e); 
      } 
      finally{ 
       this.closeSession(); 
      } 
      return list; 
     }