【发布时间】:2018-01-01 09:45:17
【问题描述】:
我已将我的应用程序从 Hibernate 3 升级到 5.2.10。 Hibernate 的标准已被弃用,因此我修改了我的代码以使用 JPA 标准。
问题在于 Hibernate 需要在 DTO 类中为所选字段指定一个特定的构造函数。
在 Hibernate 3 中,在使用投影和 setResultTransformer(new AliasToBeanResultTransformer(MyDTO.class)) 时,一个空的构造函数和一个 getter/setter 对足以将结果映射到 DTO。
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<MyDTO> criteria = builder.createQuery(MyDTO.class);
Root<MyEntity> root = criteria.from(MyEntity.class);
criteria.multiselect(root.get(MyEntity_.id).get(MyEntityId_.fieldToSelect));
return getEntityManager().createQuery(criteria).getResultList();
我遇到了这个异常:
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [MyDTODTO]. Expected arguments are: java.lang.String [select new MyDTODTO(generatedAlias0.fieldToSelect) from MyEntity as generatedAlias0]
根据javadoc,这是正常的:
如果某个用户定义的类 X 的条件查询类型为
CriteriaQuery<X>(即,通过将 X 类参数传递给createQuery方法创建的条件查询对象),则将列表的元素传递给多选方法将被传递给 X 构造函数,并且将为每一行返回一个 X 类型的实例。
如果我使用,我也会遇到同样的问题:
criteria.select(builder.construct(MyDTO.class, field1,.., fieldn)
我的 DTO 可以被不同的查询使用我不想为不同的查询创建不同的构造函数。
我可以避免创建兼容的构造函数吗?
【问题讨论】:
-
嗨,@rawadolb,我在这里遇到了同样的问题,你有没有找到任何关于这个的问题?
-
嗨@cingulata..不,我没有..我正在使用queryDsl来避免这个问题
-
你能分享一个样本吗?嵌套对象呢?
-
两种意见: 1.如果两个查询选择不同的值,它们不应该返回相同类型的对象。 2. 无论如何,我发现将结果作为 List
-
@cingulata :抱歉延迟回复。在这里查看我的答案
标签: hibernate projection criteria-api