2012-05-22 5 views
3

위생적인 ​​예제로 시작하겠습니다.특정 서브 클래스를 사용하는 행을 찾는 조건 쿼리

내 시스템에는 Car 클래스가 있습니다. Car에는 여러 필드가 있으며, 그 중 GearShift 클래스의 gearShift 인스턴스가 있습니다.

public class Car { 
    private GearShift gearShift; 

    // Snip 
} 

GearShift는 AutomaticShift와 StickShift가 상속하는 추상 클래스입니다. 이것은 Hibernate에서 table-per-subclass로 매핑된다.

이제 자동 기어 교대로 자동차를 사고 싶다고 말하십시오. 나는 Hibernate criteria를 통해 이렇게하는 것을 선호한다. 그래서 나는 아래에 보여지는 것처럼 추가 할 수있는 "ofType"제한을 상상하고있다.

getSession().createCriteria(Car.class) 
    .add(Restrictions.ofType(AutomaticShift.class) 
    .list(); 

어떤 방식 으로든 가능합니까?

+0

매핑 방법을 알려주세요. 판별자를 사용합니까? – Selim

+0

HQL을 사용하는 것이 왜 옵션이 아닌가? Criteria API는 완전한 Hibernate 기능을 노출하지 않는다. –

답변

9

OLD :이 방법에 대해

?

getSession().createCriteria(AutomaticShift.class).list() 

편집 :이 트릭을 할해야

;

getSession().createCriteria(Car.class).createAlias("gearShift", "gs").add(Restrictions.eq("gs.class", AutomaticShift.class)).list(); 
+0

그러면 자동 기어 목록 만 반환됩니다. -1 이것에 대해 –

+0

@ RaulGogo : 그게 내가하고 싶은 일이지만 : S 다른 것을 이해합니까? – Selim

+0

그는 자동 기어가있는 ** 자동차 ** 목록을 원합니다. –

0

은 아마 약간의 오버 헤드 같은 소리,하지만 당신은 2 단계에서 그것을 할 수 :

  1. 는 자동 기어의 모든 ID를 검색합니다

    List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class) 
                 .setProjection(Projections.distinct(Property.forName("id"))) 
                 .list(); 
    
  2. 가져 오기 자동 기어와 모든 차 :

    return getSession().createCriteria(Car.class).add(Restrictions.in("gearShift.id", automaticGearIds)).list(); 
    
+0

이 경우 Restrictions.in을 사용하는 것은 나쁜 습관입니다. – vhtc