JPA 构造寻找错误的构造函数
JPA construct looking for wrong constructor
我们正在尝试使用 JPA construct()
API 将数据映射到我们的对象中,但不幸的是它似乎忽略了类型转换:
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder();
CriteriaQuery<ReportDto> q = cb.createQuery(ReportDto.class);
q.select(cb.construct(DailyReportDto.class, r.get(createdYear),
r.get(KpiSnapshot_.createdDay),
cb.toLong(cb.avg(r.get(KpiSnapshot_.value)))));
结果:
java.lang.NoSuchMethodException: DailyReportDto.<init>(java.lang.Integer, java.lang.Integer, java.lang.Double)
这对我来说没有意义,因为 toLong
应该阻止它寻找 Double,不是吗?
toLong 和该形式的其他 CriteriaBuilder 方法不会创建新表达式或以任何方式更改它们 - 它们用于转换,更改表达式的通用类型。您的表达式仍然是 b.avg(r.get(KpiSnapshot_.value)),它仍然是一个双精度值。
如果需要,您的构造函数将需要处理将 Double 转换为 Long。
我们正在尝试使用 JPA construct()
API 将数据映射到我们的对象中,但不幸的是它似乎忽略了类型转换:
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder();
CriteriaQuery<ReportDto> q = cb.createQuery(ReportDto.class);
q.select(cb.construct(DailyReportDto.class, r.get(createdYear),
r.get(KpiSnapshot_.createdDay),
cb.toLong(cb.avg(r.get(KpiSnapshot_.value)))));
结果:
java.lang.NoSuchMethodException: DailyReportDto.<init>(java.lang.Integer, java.lang.Integer, java.lang.Double)
这对我来说没有意义,因为 toLong
应该阻止它寻找 Double,不是吗?
toLong 和该形式的其他 CriteriaBuilder 方法不会创建新表达式或以任何方式更改它们 - 它们用于转换,更改表达式的通用类型。您的表达式仍然是 b.avg(r.get(KpiSnapshot_.value)),它仍然是一个双精度值。
如果需要,您的构造函数将需要处理将 Double 转换为 Long。