繁体   English   中英

休眠标准:加入实体的投影

[英]Hibernate Criteria: projection with joined entity

我正在尝试使用Criteria创建查询,但无法成功映射来自已连接实体的数据。

使用此条件查询,订单实体的ID被ShippingCondition实体的ID覆盖:

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();

我的实体:

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

我已经tryed更换.add(Projections.property("sc.id"), "id")通过.add(Projections.property("sc.id"), "shippingCondition.id")但后来我得到一个ClassCastException (java.lang.ClassCastException: entity.Order cannot be cast to java.util.Map)

你知道我该怎么做吗?

谢谢

Hibernate不支持嵌套投影。 您将需要为此创建DTO 您可以从Order类扩展DTO并添加方法以设置ShippingCondition字段。

class OrderDto extends Order {

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

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

}

如果不想使用DTO可以使用特殊的嵌套转换器

如何使用Hibernate转换平面结果集

补充笔记

JPA根本不支持任何变压器。 而且很难以一致的方式实现这种变压器。 例如,我的转换器不支持@OneToMany类的@OneToMany ,仅支持单个关联。 另外,您不能将嵌套投影与HQL一起使用,因为HQL不支持parent.child别名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM