2017-11-13 13 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(); 

マイエンティティ:この基準では

は、OrderエンティティのIDがShippingConditionエンティティのIDで上書きされるクエリ

@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; 
    ... 
} 

私は.add(Projections.property("sc.id"), "shippingCondition.id").add(Projections.property("sc.id"), "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

関連する問題