Java Hibernate条件:具有连接实体的投影
我试图创建一个带有条件的查询,但是我没有成功地映射来自连接实体的数据 使用此条件查询,订单实体的id将被ShippingCondition实体的id覆盖:Java Hibernate条件:具有连接实体的投影,java,hibernate,criteria,hibernate-criteria,Java,Hibernate,Criteria,Hibernate Criteria,我试图创建一个带有条件的查询,但是我没有成功地映射来自连接实体的数据 使用此条件查询,订单实体的id将被ShippingCondition实体的id覆盖: final Criteria criteria = session.createCriteria(Order.class, "o") .createAlias("o.shippingCondition", "sc", JoinType.INNER_JOIN) .setProjection(Projections.project
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”),“id”)
。add(Projections.property(“sc.id”),“shippingCondition.id”)
,但后来我得到了一个ClassCastException(java.lang.ClassCastException:entity.Order不能转换为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
附加注释
JPA
根本不支持任何变压器。这种变压器很难以一致的方式实现。例如,“我的转换器”不支持子集合,如@OneToMany
,只支持单个关联。此外,您不能将嵌套投影与HQL一起使用,因为HQL不支持parent.child
别名 它工作得很好,但奇怪的是hibernate没有提出这个解决方案。有什么原因吗?你有@OneToMany系列的图片吗?我不想在懒惰模式下使用getter,它太难看了。。。我只想执行一个查询来获取我的data@Nan你可以自己试试。也许它会起作用。您可以使用criteria.setFetchMode()
来获取集合。好的,但我只想选择集合中的一些字段。我正试着用你给我的变压器。我想这是不可能的。您可以检查实体图