2012-10-09 3 views
1

잘 작동하는 조건 쿼리가 있습니다.최대 절전 모드 쿼리 ... 새 조건 추가

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
criteria.add(Restrictions.eq("employerId",employerId)) 
     .setFetchMode("card", FetchMode.JOIN) 
     .createCriteria("card") 
     .addOrder(Order.desc("cardId")) 
     .createCriteria("salary") 
     .add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)) 
     .add(Restrictions.eq("active","YES")); 

이제이 조건에 다른 필터 (조건)를 추가해야합니다. 새 필터는 joinDate입니다. 프런트 엔드에서 joinDate 값이 전달 된 경우이 쿼리에 추가해야합니다. 그렇지 않으면 필터 joinDate을 추가해서는 안됩니다.

나는 분리를 사용하여이 작업을 처리했다. (나는 이상하게 생각한다. 그러나 AFAIK, 단지 분리는 런타임에 필터를 추가 할 수있는 기능을 제공한다. 나는 이것을 좋아하지 만, 나는 여기서 다른 선택을 사용하고 싶지 않고 다른 선택을 찾고있다.

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
------------------------------------------------------------------------- 
Disjunction disjunctionDate = Restrictions.disjunction(); 
    if(utilDate!=null){ 
    disjunctionDate = (Disjunction) disjunctionDate.add(Restrictions.ge("startDate", utilDate)); 
    } 
----------------------------------------------------------------------- 
    criteria.add(Restrictions.eq("employerId",employerId)) 
      .setFetchMode("card", FetchMode.JOIN) 
      .createCriteria("card") 
      .addOrder(Order.desc("cardId")) 
      .createCriteria("salary") 
      .add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)) 
      .add(Restrictions.eq("active","YES")) 
       .add(disjunctionDate); 

난 그냥 조건 경우 다음과 같이 사용하지만, 작동하지 않는 노력했다 (심지어이 컴파일하려면, 나는 위의 모든 라인에있는 모든 라인과 세미콜론의 기준을 데 쿼리 형식을 수정했다).

Criteria criteria = getSession().createCriteria(getPersistentClass()); 
    criteria.add(Restrictions.eq("employerId",employerId)); 
    criteria.setFetchMode("card", FetchMode.JOIN); 
    criteria.createCriteria("card"); 
    criteria.addOrder(Order.desc("cardId")); 
    criteria.createCriteria("salary"); 
    criteria.add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR)); 
    criteria.add(Restrictions.eq("active","YES")); 
    if(startDate!=null){ 
     criteria.add(Restrictions.ge("startDate",startDate)); 
    } 

분리형을 사용하는 것보다 더 나은 옵션으로이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

4

그렇다면 이것이 효과가 없다고 말하는 중입니까?

Criteria criteria = getSession().createCriteria(getPersistentClass()) 
    .add(Restrictions.eq("employerId",employerId)) 
    .setFetchMode("card", FetchMode.JOIN) 
    .createCriteria("card") 
    .addOrder(Order.desc("cardId")) 
    .createCriteria("salary", "sl") // <- alias for salary 
    .add(Restrictions.eq("sl.salaryType",SalaryIdentifierType.CONTRACTOR)) 
    .add(Restrictions.eq("sl.active","YES")); 

if(startDate!=null) { 
    criteria.add(Restrictions.ge("sl.startDate",startDate)); 
} 

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#querycriteria-associations

+0

yes..it가 작동하지 않는보기 ... 기본적으로 "statrtDate는"이 아니라 "getPersistentClass()"테이블에 급여 테이블에 있습니다. 게시물에 표시된 코드에서 hibernate는 "getPersistentClass()"테이블에서 startDate 열을 찾으려고 시도합니다. 따라서 작동하지 않습니다 – user1717230

+1

질문에 startDate가 다른 테이블에 있다고 언급하지 않았습니다. 어쨌든 나는 내 대답을 편집했다. 급여의 별명을 지정해야합니다. –