如何使用JPA自定义VO接收返回结果集
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO接收返回结果集(unwrap)JPA跟mybitis比较,简
千家信息网最后更新 2025年11月15日如何使用JPA自定义VO接收返回结果集
这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
JPA自定义VO接收返回结果集(unwrap)
JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的SQL搜索时,我们需要自定义SQL。
1.@Query直接写SQL,缺点是无法动态的组装条件
2.JPA的Specification对象动态组装where搜索条件
3.entityManager执行CriteriaBuilder
4.entityManger直接使用createNativeQuery,执行原生SQL。这里设计到返回结果集的承载体必须是数据库对应的实体。
这里说一个自定义的VO承接返回结果集的方法
ProjectAttendanceEntity @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "f_id") private Long fId; @Column(name = "user_id") private Integer userId; @Column(name = "zh_name") private String zhName; @Column(name = "po_code") private String poCode; @Column(name = "po_name") private String poName; @Column(name = "punch_date") private String punchDate; @Column(name = "is_original") private String isOriginal; @Column(name = "attendance_hours") private String attendanceHours; @Column(name = "work_hours") private String workHours; @Column(name = "punch_area") private String punchArea;
结果集承接VO (AttendancePoSzVO)
private String poId; private String poName; private String zhName;
执行接口:
/** * 批量修改项目名称 * @return */ @PostMapping("/po/sz/batch/{project}/{pn}/{ps}") public PageResultVO findBatchPoInfoByUserIdAndDate(@RequestBody List ids,@PathVariable String project,@PathVariable Integer pn,@PathVariable Integer ps){ log.info("url:/po/sz/batch/"+"|param:"+ids); //通过id查询数据 List projects = projectAttendanceEntityRepository.findByIdIn(ids); //获取SQL String sql = getSQL(projects,pn,ps); Query query = entityManager.createNativeQuery(sql); List list = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList(); //初始化结果集 List result = new ArrayList<>(); for(AttendancePoSzVO poSz : list){ result.add(new DropDownVO(poSz.getPoName(),poSz.getPoId())); } return new PageResultVO(GlobalReturnCode.SUCCESS_CODE,"SUCCESS",ps,pn,result); } /** * 组装查询SQL * @return */ public String getSQL(List poStatus, Integer pn, Integer ps){ StringBuilder sql = new StringBuilder("SELECT DISTINCT res.po_id as poId,res.po_name as poName, GROUP_CONCAT(DISTINCT res.user_id) AS zhName "); sql.append(" FROM ("); sql.append(" SELECT tt.po_name,tt.po_id,tt.user_id"); sql.append(" FROM sie_sz_po_attendance_v tt "); sql.append(" WHERE"); for(ProjectAttendanceEntity po : poStatus){ sql.append("(tt.user_id = ").append(po.getUserId()).append(" and tt.rt_begin_date <= '").append(po.getPunchDate()) .append("' and tt.rt_end_date >= '").append(po.getPunchDate()).append("') OR "); } //截掉最后一个OR sql = new StringBuilder(sql.substring(0,sql.length()-3)); sql.append(" ) res"); sql.append(" GROUP BY res.po_name,res.po_id"); sql.append(" HAVING "); for(ProjectAttendanceEntity po : poStatus){ sql.append(" INSTR(zhName,").append(po.getUserId()).append(") >0").append(" AND "); } //截取最后一个AND sql = new StringBuilder(sql.substring(0,sql.length()-4)); sql.append(" LIMIT ").append(pn).append(",").append((pn+1)*ps); return sql.toString(); } 核心代码:
Listlist = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList();
但是这里的 setResultTransformer 已经过时了。
所以接下来寻找 setResultTransformer的替代API。
JPA返回自定义VO
最近做项目用到了JPA,很多地方需要返回自定义vo,最开始用@Query注解返回自定义List
一般需要返回自定VO都是做连表动态查询,下面直接贴测试代码
User(Entity)
@Data@Entity@Table(name = "jpa_user")@AllArgsConstructor@NoArgsConstructor@Accessors(chain = true)public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name ="name") private String name; @Column(name ="age") private Integer age; @Column(name ="sex") private String sex; @Column(name ="card") private String card; @Column(name ="children") private Boolean children;}UserRespDto(自定义VO)
@Datapublic class UserRespDto implements Serializable { private String myname; private String mycard;}JPA接口不说了,继承JpaRepository和JpaSpecificationExecutor就行
测试
/** * 返回Entity对象,要求是数据库中字段全部查询 即findAll或者理解为select * */ @Test public void t2() { StringBuilder sb = new StringBuilder(); sb.append("select * from jpa_user where 1=1 "); //自行根据条件动态拼接,仅做演示 sb.append(" and name like '%李%' "); Query nativeQueryPo = entityManager.createNativeQuery(sb.toString(), User.class); List resultList = nativeQueryPo.getResultList(); System.out.println(resultList); } /** * 返回自定义VO对象,要求是查询别名必须和VO中属性名一致 */ @Test //注意,很重要,事务必须开启,不开启会报错提示无法转化,具体原因和动态代理有关系 @Transactional(readOnly = true) public void t3() { StringBuilder sb = new StringBuilder(); sb.append("select name myname,card mycard from jpa_user where 1=1 "); //自行根据条件动态拼接,仅做演示 sb.append(" and name like '%李%' "); Query nativeQuery = entityManager.createNativeQuery(sb.toString()); List list = nativeQuery.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(UserRespDto.class)).list(); System.out.println(list); }以上是"如何使用JPA自定义VO接收返回结果集"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
结果
动态
查询
条件
对象
数据
搜索
代码
内容
接口
数据库
篇文章
项目
求是
测试
演示
设计
复杂
过时
重要
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库系统教程 百度网盘
服务器设计五部曲
r740服务器cpu锁频
软件开发哪个招聘网最好
锅炉控制器软件开发
java如何将文件存入数据库中
奇安信网络安全工程师认证难吗
服务器那家好
网络安全策略汇总
网站对于服务器安全的建议
打卡怎么设计数据库表
千鲜汇软件开发十荟团
gencode数据库
服务器管理员登录密码错误
网络安全信息安全保研夏令营
sql数据库两个表快速查重
数据库属性的闭包算法
vscode数据库展示插件
去学软件开发可以吗
oracle清空数据库表
删除数据库某一列
广闪联网络技术有限公司
万方数据库收录
腾讯云服务器有固定ip吗
pdo 关闭数据库
锐龙cpu做软件开发
csgo如何看服务器
服务器托管与租用
成都网络安全服务
全球软件开发人员大概多少