Hibernate Criteria:具有连接实体的投影
Hibernate Criteria: projection with joined entity
我正在尝试使用 Criteria 创建查询,但未能成功映射来自已连接实体的数据。
使用此条件查询,Order 实体的 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;
...
}
我尝试用 .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)
你知道我该怎么做吗?
谢谢
Hibernate 不支持嵌套投影。您需要为此创建 DTO
。您可以从 Order
class 扩展 DTO
并添加方法来设置 ShippingCondition
.
的字段
class OrderDto extends Order {
public OrderDto() {
setShippingCondition(new ShippingCondition());
}
public void setShippingConditionId(Integer id) {
getShippingCondition().setId(id);
}
}
如果你不想使用,你可以使用一个特殊的嵌套转换器DTO
补充说明
JPA
根本不支持任何转换器。并且很难以一致的方式实现这样的转换器。例如,我的转换器不支持像 @OneToMany
这样的子集合,只支持单个关联。此外,您不能对 HQL 使用嵌套投影,因为 HQL 不支持 parent.child
别名。
我正在尝试使用 Criteria 创建查询,但未能成功映射来自已连接实体的数据。
使用此条件查询,Order 实体的 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;
...
}
我尝试用 .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)
你知道我该怎么做吗?
谢谢
Hibernate 不支持嵌套投影。您需要为此创建 DTO
。您可以从 Order
class 扩展 DTO
并添加方法来设置 ShippingCondition
.
class OrderDto extends Order {
public OrderDto() {
setShippingCondition(new ShippingCondition());
}
public void setShippingConditionId(Integer id) {
getShippingCondition().setId(id);
}
}
如果你不想使用,你可以使用一个特殊的嵌套转换器DTO
补充说明
JPA
根本不支持任何转换器。并且很难以一致的方式实现这样的转换器。例如,我的转换器不支持像 @OneToMany
这样的子集合,只支持单个关联。此外,您不能对 HQL 使用嵌套投影,因为 HQL 不支持 parent.child
别名。