spring-data-jpa 使用基于类的DTO时,JPA CriteriaQuery MultiSelect在LEFT Join上失败,是否有某种方法可以修复此问题?

ftf50wuq  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(192)

参照条件查询API文档
条件查询多选(选择〈?〉...选择)
如果某个用户定义的类X(即,通过将X类参数传递给createQuery方法创建的条件查询对象)的条件查询类型为CriteriaQuery,则multiselect方法的参数将传递给X构造函数,并且将为每行返回一个类型为X的示例。
我有我的声明一些事情像下面-

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Xcain4> query = cb.createQuery(ProductWrapper.class);
Root<TableA> root = query.from(TableA.class);
Join<TableA, TableB> TableBJoin = root.join("tabBList", JoinType.INNER);

我的多选是-

query.multiselect(root.get("col11"), tableBJoin.get("col21"))

当我执行查询时,它工作正常..我能够获得ProductWrapper的列表。

但当我将联接类型更改为LEFT

Join<TableA, TableB> TableBJoin = root.join("tabBList", JoinType.LEFT);

我面临以下错误-
[编辑][编辑][编辑][编辑][编辑]路径为[]的上下文中的servlet [dispatcherServlet]的Servlet.service()引发了异常错误[请求处理失败;嵌套的异常是一个无效的数据访问应用程序使用异常:org.hibernate.QueryException:无法从元组示例化类[com.exp.reports.dtos.ProductWrapper];嵌套的异常是java.lang.IllegalArgumentException:org.hibernate.QueryException:无法示例化具有根本原因的类[来自元组的com.exp.reports.dtos.ProductWrapper]
我想,这是因为当使用LEFT Join时,TableB的Col 21的值很少会是null。所以对于ProductWrapper类,我添加了一个单独的args构造函数-〉public ProductWrapper(String col11) {...} ;。但这并没有解决问题。
我可以切换到基于元组的返回类型,它也可以很好地与外部连接一起工作,但我必须编写元组到DTO转换器。作为一个首选,我想使用基于类的方法而不是元组。有人有什么建议,如何解决这个问题,而不切换到元组。
我使用的是SB和Spring引导启动器数据jpa:2.7.0
我已经看过了这个参考,但是作者在左连接的情况下使用了元组,就像我说的,我试过元组,它很好用。如果有人遇到过任何基于类的DTO与左/右连接一起使用的参考,请分享。

xzabzqsa

xzabzqsa1#

错误信息不清楚,因此不容易找到原因。
由于左连接会导致某些列值为空,因此Hibernate无法将空值Map到pojo。原因是pojo中存在与结果集空值对应的原语。

ProductWrapper {
long filed1;
}

改成了-

ProductWrapper {
Long filed1;
}

它正在工作。

相关问题