hibernate 由于从5.2升级成5.4 再用了ResultTransformer封装临时对象时sonar 报错,显示ResultTransformer 过时
官方在5.2版本中将此方法标记为过时,但没有提供替代方案,需要升级到6.0时才提供提到方法
虽然ResultTransformer方法过时,但接口并没有,我们可以通过内部类的方式实现自定义封装。
List<PersonAndCountryDTO> personAndAddressDTOs = entityManager
.createQuery(
"select p, c.name " +
"from Person p " +
"join Country c on p.locale = c.locale " +
"order by p.id")
.unwrap( org.hibernate.query.Query.class )
.setResultTransformer(
new ResultTransformer() {
@Override
public Object transformTuple(
Object[] tuple,
String[] aliases) {
return new PersonAndCountryDTO(
(Person) tuple[0],
(String) tuple[1]
);
}
@Override
public List transformList(List collection) {
return collection;
}
}
)
.getResultList();
不实现该接口我们可以通过HQL 的方式实现封装:
但由于hql 总不支持子查询 生成的虚表必须有对应的实体类跟映射文件才可,不然会报如下异常:
org.hibernate.hql.internal.ast.QuerySyntaxException:
unexpected token: ( near line 1, column 136
[SELECT new com.gravity.dao.job.JobStatusAlertItem(j.id, j.clientId, c.lastHiredTime)
FROM com.gravity.model.job.JobPO AS j
INNER JOIN (
SELECT ce.jobId, COUNT(ce.candidateId) AS hiredNum, MAX(ce.changedTime)*1000 AS lastHiredTime
FROM com.gravity.model.analytic.CandidateHireOrBackBurnerEventsPO AS ce
WHERE ce.status=60
AND ce.candidateId NOT IN ((SELECT cd.id FROM com.gravity.model.candidate.CandidateDeletedPO AS cd)) GROUP BY ce.jobId
) AS c ON c.jobId = j.id WHERE j.status = 2 AND j.noOfOpenings <= c.hiredNum AND j.confidential IS FALSE AND j.candidatePool IS FALSE]
最后 只能使用 list<Object[]> 接收收据。
HQL中使用子查询解决方法: https://blog.csdn.net/fableking/article/details/3167081
今天的文章ResultTransformer deprecated 替代方案及HQL无法使用子查询解决分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12199.html