没有合适的资源?快使用搜索试试~ 我知道了~
SpringDataJpa 动态复杂查询NativeQuery
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
8 下载量 120 浏览量
2020-12-22
01:53:04
上传
评论
收藏 64KB PDF 举报
温馨提示
试读
2页
SpringDataJpa 动态复杂查询NativeQuery emm挺长时间没更新了,最近在忙项目,外加搬家,后续会继续更新 遇到一个复杂的sql查询,在不通过外键关联的情况下,只能选择使用原生sql的方式查询,但是遇到一个极其XX的问题 首先去了Spring官方和一些博客调查了一下,感觉Jpa还是偏冷门讨论的不多,一搜索好多还是15年的信息… 当前SpringBoot版本信息 2.2.5.RELEASE 如果使用网上大家说的方式会出现这个异常,但是都说好像可以用,可能跟版本有关系,或者网上说的有问题 List list = nativeQuery.unwrap(NativeQuer
资源推荐
资源详情
资源评论
SpringDataJpa 动态复杂查询动态复杂查询NativeQuery
SpringDataJpa 动态复杂查询动态复杂查询NativeQuery
emm挺长时间没更新了,最近在忙项目,外加搬家,后续会继续更新
遇到一个复杂的遇到一个复杂的sql查询,在不通过外键关联的情况下,只能选择使用原生查询,在不通过外键关联的情况下,只能选择使用原生sql的方式查询,但是遇到一个极其的方式查询,但是遇到一个极其XX的问题的问题
首先去了Spring官方和一些博客调查了一下,感觉Jpa还是偏冷门讨论的不多,一搜索好多还是15年的信息…
当前SpringBoot版本信息
2.2.5.RELEASE
如果使用网上大家说的方式会出现这个异常,但是都说好像可以用,可能跟版本有关系,或者网上说的有问题
List list = nativeQuery.unwrap(NativeQueryImpl.class)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
.list();
java.lang.ClassCastException: com.sun.proxy.$Proxy220 cannot be cast to org.hibernate.query.internal.NativeQueryImpl
这一种倒是没有过时,每次运行到这行就会出上面代理对象转NativeQueryImpl的异常
(有知道原由的大佬留言讨论一下)(有知道原由的大佬留言讨论一下)
看了SQLQuery的源码,过时的方法被迁移到了NativeQuery
但是切换到了NativeQuery,setResultTransformer方法依然是过时的,然后直接打了一个todo我也是很迷
1.使用已经过时的方法时,可以返回对应的实体(但是类型会有一些恶心比如使用已经过时的方法时,可以返回对应的实体(但是类型会有一些恶心比如Long会被映射为会被映射为BigInteger))
Query nativeQuery = entityManager.createNativeQuery(SqlBuildFactory.buildCopyrightSearchCountSql(copyrightSearchDto));
List list = nativeQuery.unwrap(NativeQuery.class)
.setResultTransformer(Transformers.aliasToBean(CopyrightSearchResultDto.class))
.list();
//实体中类型是Long , db中是bigint
Expected type: java.lang.Long, actual value: java.math.BigInteger
2.也可以返回也可以返回map,,key为别名,为别名,value为值为值
Query nativeQuery = entityManager.createNativeQuery(SqlBuildFactory.buildCopyrightSearchCountSql(copyrightSearchDto));
List list = nativeQuery.unwrap(NativeQuery.class)
.setResultTransformer(Transformers.aliasToBean(Transformers.ALIAS_TO_ENTITY_MAP))
.list();
3.反正第一种我是吐了,还好可以自定义反正第一种我是吐了,还好可以自定义ResultTransformer对象,实现对象,实现ResultTransformer接口就行了,转换就比较简单了接口就行了,转换就比较简单了
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Object o = null;
try {
o = dto.newInstance();
Field[] declaredFields = dto.getDeclaredFields();
for (Field declaredField : declaredFields) {
for (int i = 0; i < aliases.length; i++) {
if(declaredField.getName().equalsIgnoreCase(aliases[i])){
declaredField.setAccessible(true);
if("java.lang.Long".equals(declaredField.getGenericType().getTypeName())){
BigInteger bigInteger = (BigInteger) tuple[i];
declaredField.set(o,bigInteger.longValue());
}else{
declaredField.set(o,tuple[i]);
}
}
}
}
} catch (InstantiationException e) {
资源评论
weixin_38748875
- 粉丝: 10
- 资源: 951
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功