부모 엔티티 (고객)의 이름과 상태에 검색 키워드를 적용하고 하위 엔티티 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은 직전이지만 여전히 그렇지 않습니다. ~ 안에 두번째 또는 성명서 ... 나는 너무 혼란 스럽다.
내가 먼저 시도하고 나는이 예외 org.hibernate있어 그게 문제 .QueryException : property : order.name of : com.company.dao.entities.Customer를 확인할 수 없습니다. – hajime
별칭을 만들기 전에 작성한 것이므로 아마 그럴 것입니다. 완전한 Criteria 작성 코드를 게시했다면 도움이 될 것입니다. –
현재 패턴은 서비스 계층에서 제한을 생성하고 DAO가있는 현재 엔티티를 기반으로하는 DAOBase 추상 클래스를 전달하여 엔티티 클래스를 가져온 다음 조건을 호출하고 제한 사항 이후에 createAlias를 호출합니다. 이 기준에 적용되었습니다. 전에 이거해야합니까? – hajime