2012-02-16 1 views
5

연결에 QBE를 사용할 수 없다는 것은 매우 실망 스럽습니다.연결에 대한 예제 별 쿼리

필자는 약 8 개의 다 대일 열이있는 대형 datatable을 사용합니다. 표를 필터링하는 모든 열에 대한 드롭 다운 목록이 있습니다.

의 다음을 가정 해 봅시다 :

표 사용자

User { id, UserStatus, UserAuthorization } 

나는이 코드를 사용하려면 :

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

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

이 다음 예 userObject에서 작동하지 않습니다 QBE가 모음을 지원하지 않기 때문에

.

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

내 질문이 그냥 주어진 User 객체에 동적으로 프로그래밍 할 수있는 방법입니다 :이 문제를 해결하기 위해

한 가지 방법은이 방법을 사용하는 것입니다. QBE를 사용하는 것보다 다른 방법이 있습니까?

+0

.add (Restriction.eq())? – Firo

+0

나는 그것을 피하려고 ... QBE 뒤에있는 모든 것은 손으로 일을하지 않는 것입니다. – rotsch

+0

"QBE를 사용하는 것보다 다른 방법이 있습니까?" : D – Firo

답변

2

당신이 반사하여, 여기에 내가 내 저장소 기반의 내부 나를 위해 일한 발견 일반적인 대답이다 QBE 나던 지원을

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

고마워,이 동적 인 것을 만들 수있는 방법이 있습니까? – rotsch

1

을 부분을 처리하기 위해 QBE 및 일반 식을 결합 할 수 있습니다 :

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); 
} 

모든 엔티티는 IEntityBase에서 상속받습니다.이 엔티티는 객체 속성에서 외래 키 참조 만 찾을 수 있도록 허용하므로 조건에 추가 할 수있었습니다. 검색어를 실행할 수있는 방법을 제공해야합니다 (예 : c.GetExecutableCriteria (Session)).

0

최대 절전 모드에서 검색어로 검색어를 사용하는 데 사용할 수있는 코드는 다음과 같습니다.

/** 
       * 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; 
     }