ResultTransformer deprecated 替代方案及HQL无法使用子查询解决

ResultTransformer deprecated 替代方案及HQL无法使用子查询解决hibernate由于从5.2升级成5.4再用了ResultTransformer封装临时对象时sonar报错,显示ResultTransformer过时官方在5.2版本中将此方法标记为过时,但没有提供替代方案,需要升级到6.0时才提供提到方法虽然ResultTransformer方法过时,但接口并没有,我们可以通过内部类的方式实现自定义封装。List<PersonAndCo…

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[]> 接收收据。

参考: https://vladmihalcea.com/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/

HQL中使用子查询解决方法: https://blog.csdn.net/fableking/article/details/3167081

今天的文章ResultTransformer deprecated 替代方案及HQL无法使用子查询解决分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12199.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注