Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate条件:具有连接实体的投影_Java_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

Java Hibernate条件:具有连接实体的投影

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

我试图创建一个带有条件的查询,但是我没有成功地映射来自连接实体的数据

使用此条件查询,订单实体的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”),“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()
来获取集合。好的,但我只想选择集合中的一些字段。我正试着用你给我的变压器。我想这是不可能的。您可以检查实体图