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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值