2017-11-13 14 views
0

Criteria를 사용하여 쿼리를 만들려고 시도하지만 조인 된 엔터티의 데이터를 매핑하지 못합니다.Hibernate Criteria : 조인 된 엔티티를 사용한 프로젝션

final Criteria criteria = session.createCriteria(Order.class, "o") 
    .createAlias("o.shippingCondition", "sc", JoinType.INNER_JOIN) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("o.id"), "id") 
     .add(Projections.property("o.orderNum"), "orderNum") 
     .add(Projections.property("o.notes"), "notes") 
     .add(Projections.property("sc.id"), "id")) 
    .add(Restrictions.eq("o.id", id)) 
    .setResultTransformer(Transformers.aliasToBean(Order.class)); 

return (Order) criteria.uniqueResult(); 

내 기관 : 나는 .add(Projections.property("sc.id"), "shippingCondition.id")하지만 의해 .add(Projections.property("sc.id"), "id")을 대체하기 위해 tryed했다

@Table(name = "order", schema = "myschema") 
public class Order { 

    private Integer id; 
    private String orderNum; 
    private String notes; 
    private ShippingCondition shippingCondition; 
    ... 
} 

@Table(name = "shipping_condition", schema = "myschema") 
public class ShippingCondition { 

    private Integer id; 
    private String shippingCondition; 
    private Integer sorting; 
    ... 
} 

이 기준에

는 ShippingCondition 엔티티의 ID로 오버라이드 (override) 된 주문 엔티티의 ID를 조회 ClassCastException이 발생합니다. (java.lang.ClassCastException: entity.Order cannot be cast to java.util.Map)

어떻게 할 수 있습니까?

감사합니다.

답변

0

Hibernate는 중첩 투영을 지원하지 않습니다. 이를 위해 DTO을 만들어야합니다. DTOOrder 클래스에서 확장하고 ShippingCondition 필드를 설정하는 메소드를 추가 할 수 있습니다. 당신이 전혀 변압기를 지원하지 않습니다 DTO

How to transform a flat result set using Hibernate

추가 참고

JPA을 사용하지 않으려면

class OrderDto extends Order { 

    public OrderDto() { 
     setShippingCondition(new ShippingCondition()); 
    } 

    public void setShippingConditionId(Integer id) { 
     getShippingCondition().setId(id); 
    } 

} 

당신은 특별한 중첩 된 변압기를 사용할 수 있습니다. 그리고 그러한 변압기를 일관성있게 구현하는 것은 어렵습니다. 예를 들어, 변압기는 @OneToMany과 같은 자식 컬렉션을 지원하지 않으며 단일 연결 만 지원합니다. 또한 HQL은 parent.child 별칭을 지원하지 않기 때문에 HQL과 함께 중첩 투영을 사용할 수 없습니다.

+0

잘 작동하지만 최대 절전 모드에서는이 솔루션을 제안하지 않는 것이 이상합니다. 이유가 있니? – Nan

+0

@Nan 잘 작동하는 'OrderDto'는 무엇입니까? –

+0

특수 중첩 변압기가 잘 작동합니다. – Nan