2011-02-10 4 views
3

비즈니스 및 영역이라는 두 개의 엔터티가 있습니다.최대 절전 기준 두 테이블에 합류했습니다.

관련 속성 :
사업 - 지역, AREA2, 코드
지역 - areaId, 나는이 최대 절전 모드를 쓰기 위해 노력하고있어

지역의 ID에

영역과 비즈니스지도의 AREA2를 AREANAME 비즈니스와 관련된 모든 영역을 반환하는 기준.

SQL은 다음과 같습니다 영역에서 왼쪽 외부 a.areaId = b.area 또는 a.areaId = b.area2 WHERE a.areaName

BY b.code = null이 GROUP 에 비즈니스 나 가입하세요! 내가 얻을

DetachedCriteria criteria = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area")) 
.setProjection(Property.forName("area2")) 
.add(Restrictions.ne("code", null)); 

Criteria criteriaArea = fullTextSession.createCriteria(Area.class) 
.createAlias("areaId", "areaId", CriteriaSpecification.LEFT_JOIN) 
.add(Property.forName("areaId").in(criteria)); 

을하지만이 작동하지 않습니다

이 내가 가진 무엇 "이 아니라 협회 : areaId"쿼리 예외.

왜 이런 생각입니까? 감사.

+1

작은 팁 : Restrictions.isNotNull ("코드")를 사용합니다. 일부 데이터베이스에서 "<> null"은 "is not null"과 다릅니다. –

+0

관계를 엔터티 정의에 넣었습니까? (xml 또는 annotations) – Reddy

답변

5

createAlias()은 제공된 속성을 사용하여 다른 엔터티를 조인합니다. Hibernate는 제공된 프로퍼티의 매핑을 사용하여 어떤 테이블을 조인 할지를 계산한다. 하지만 areaId@ManyToOne 또는 @ManyToMany으로 비즈니스 엔티티에 매핑되지 않았습니다. 따라서 Hibernate는 Area.areaId를 사용하여 어떤 테이블에 join하고자하는지 이해하지 못한다. 당신은 사용되지 않는 가입없이 쿼리를 다시 작성할 수 있습니다

select a.* from Area a 
left join <here should be table referenced by areaId> b on a.areaId = b.id 
where a.areaId in (
    select area, area2 from Business where code <> null 
) 

:

귀하의 기준은 같은 SQL로 변환됩니다

DetachedCriteria criteria1 = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area")); 

DetachedCriteria criteria2 = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area2")); 

Criteria criteriaArea = fullTextSession.createCriteria(Area.class) 
.add(Restrictions.or(
    Property.forName("areaId").in(criteria1), 
    Property.forName("areaId").in(criteria2) 
); 
관련 문제