2014-03-04 1 views
0

부모 엔티티 (고객)의 이름과 상태에 검색 키워드를 적용하고 하위 엔티티 Order의 이름 속성을 적용해야하는 곳이 있습니다.Hibernate "createAlias"부모 제약에 대한 자식 제한 방법을 추가하는 방법

List<Criterion> aliasRestrictionsCriterion = new ArrayList<Criterion>(); 
Junction quotedLikeRestrictions = Restrictions.disjunction(); 
quotedLikeRestrictions.add(Restrictions.ilike("customerName", token, MatchMode.ANYWHERE)); 
quotedLikeRestrictions.add(Restrictions.ilike("customerState", token, MatchMode.ANYWHERE)); 
restrictions.add(quotedLikeRestrictions); 

쿼리에서 자식 테이블을 포함하는 I 다음 쿼리를 생성하는 다음

Criteria alias = criteria.createAlias("order", "order") 
.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE)); 

최대 절전 모드를 수행하지만 내가 필요로하는 것은 비교와 같은 order.name이 추가됩니다 것입니다하고있어 부모 블록으로.

CUSTOMER this_ inner join ORDER order_ on this_.ORDER_ID=order_.ORDER_ID where 
(lcase(this_.name) like ? or lcase(this_.state) like ?) and (lcase(order_.NAME) 
like ?)   

내가 원하는 것은 부모 블록 안에 (lcase (order_.NAME) like?)가 있어야합니다. 그래서 나는 다음과 같은

(LCASE (this_.name)와 같은? 또는 LCASE (this_.state)와 같은? 또는 LCASE 같은 (order_.NAME가)?)

어떻게 이것을 달성 할 수있다 싶어?

업데이트 : 내부가 ORDER 가입 order_ this_ 고객에서 .......

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) { 
    Session session = currentSession(); 
    Criteria criteria = session.createCriteria(getEntityClass()); 

    Junction or = Restrictions.disjunction(); 
    or.add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE)); 
    criteria.createAlias("order", "order").add(or); 


    // apply restrictions. 
    if (restrictions != null) { 
     for (Criterion criterion : restrictions) { 
      criteria.add(criterion); 
     } 
    } 

    List list = criteria.list(); 
    if (list != null) { 
     return list; 
    } 
    return Collections.emptyList(); 
} 

이 선택 생산 된이 내가

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) { 
    Session session = currentSession(); 
    Criteria criteria = session.createCriteria(getEntityClass()); 

    // apply restrictions. 
    if (restrictions != null) { 
     for (Criterion criterion : restrictions) { 
      criteria.add(criterion); 
     } 
    } 

    Criteria alias = criteria.createAlias("order", "order").add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE)); 

    List list = criteria.list(); 
    if (list != null) { 
     return list; 
    } 
    return Collections.emptyList(); 
} 

업데이트 2가 기준을 호출하고있어 어떻게 this_.ORDER_ID = order_.uid where (lcase (order_.NAME) like?)? 또는 lcase (this_.name) like? 또는 lcase (this_.state) like?)

orderName은 직전이지만 여전히 그렇지 않습니다. ~ 안에 두번째 또는 성명서 ... 나는 너무 혼란 스럽다.

답변

1
음은 (는 AND를 생성하는)의 기준에 제한을 추가, 당신은 quotedLikeRestrictions 분리에 추가해야합니다의 instea

:

quotedLikeRestrictions.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE)); 
+0

내가 먼저 시도하고 나는이 예외 org.hibernate있어 그게 문제 .QueryException : property : order.name of : com.company.dao.entities.Customer를 확인할 수 없습니다. – hajime

+0

별칭을 만들기 전에 작성한 것이므로 아마 그럴 것입니다. 완전한 Criteria 작성 코드를 게시했다면 도움이 될 것입니다. –

+0

현재 패턴은 서비스 계층에서 제한을 생성하고 DAO가있는 현재 엔티티를 기반으로하는 DAOBase 추상 클래스를 전달하여 엔티티 클래스를 가져온 다음 조건을 호출하고 제한 사항 이후에 createAlias를 호출합니다. 이 기준에 적용되었습니다. 전에 이거해야합니까? – hajime