iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用JPA自定义VO接收返回结果集
  • 604
分享到

如何使用JPA自定义VO接收返回结果集

2023-06-25 16:06:22 604人浏览 独家记忆
摘要

这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO接收返回结果集(unwrap)JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的s

这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

JPA自定义VO接收返回结果集(unwrap)

JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的sql搜索时,我们需要自定义SQL。

@Query直接写SQL,缺点是无法动态的组装条件

JPA的Specification对象动态组装where搜索条件

entityManager执行CriteriaBuilder

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;

执行接口:

    @PostMapping("/po/sz/batch/{project}/{pn}/{ps}")    public PageResultVO findBatchPoInfoByUserIdAndDate(@RequestBody List<Long> ids,@PathVariable String project,@PathVariable Integer pn,@PathVariable Integer ps){        log.info("url:/po/sz/batch/"+"|param:"+ids);        //通过id查询数据        List<ProjectAttendanceEntity> projects = projectAttendanceEntityRepository.findByIdIn(ids);        //获取SQL        String sql = getSQL(projects,pn,ps);        Query query = entityManager.createNativeQuery(sql);        List<AttendancePoSzVO> list = query.unwrap(NativeQuery.class).setResultTransfORMer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList();        //初始化结果集        List<DropDownVO> 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);    }          public String getSQL(List<ProjectAttendanceEntity> 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();    }

核心代码:

List<AttendancePoSzVO> list = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.aliasToBean(AttendancePoSzVO.class)).getResultList();

但是这里的 setResultTransformer 已经过时了。

所以接下来寻找 setResultTransformer的替代api

JPA返回自定义VO

最近做项目用到了JPA,很多地方需要返回自定义vo,最开始用@Query注解返回自定义List<Objec[]>,在用forEach遍历存入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就行

测试

    @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);    }        @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接收返回结果集”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用JPA自定义VO接收返回结果集

本文链接: https://www.lsjlt.com/news/306100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用JPA自定义VO接收返回结果集
    这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO接收返回结果集(unwrap)JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的S...
    99+
    2023-06-25
  • 使用JPA自定义VO接收返回结果集(unwrap)
    目录JPA自定义VO接收返回结果集(unwrap)JPA返回自定义VOJPA自定义VO接收返回结果集(unwrap) JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复...
    99+
    2024-04-02
  • springboot jpa如何实现返回结果自定义查询
    这篇文章主要讲解了“springboot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot jpa如何实现返回结果自定义...
    99+
    2023-06-29
  • Springboot jpa使用sum()函数返回结果如何被接收
    目录jpa使用sum()返回结果如何接收1、需求2、解决方法一3、解决方法二jpa使用count函数和sum函数方法一方法二方法三jpa使用sum()返回结果如何接收 1、需求 我的...
    99+
    2024-04-02
  • springboot jpa 实现返回结果自定义查询
    目录jpa 返回结果自定义查询第一种方法第二种方法使用jpa两张表联查返回自定义实体1、创建一个SpringBoot空白项目,引入pom依赖2、application.yml配置文件...
    99+
    2024-04-02
  • 如何使用JPA自定义VO类型转换
    这篇文章主要介绍如何使用JPA自定义VO类型转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO类型转换(EntityUtils工具类)在JPA查询中,如果需要返回自定义的类,可以使用EntityUti...
    99+
    2023-06-25
  • 使用JPA自定义SQL查询结果
    目录JPA自定义SQL查询结果直接上代码最后跑一下demo代码JPA的SQL查询一点睛二JPA的NamedQuery查询三使用@Query查询JPA自定义SQL查询结果 很多时候都会...
    99+
    2024-04-02
  • 怎么使用JPA自定义SQL查询结果
    本篇内容介绍了“怎么使用JPA自定义SQL查询结果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JPA自定义SQL查询结果很多时候都会遇到自...
    99+
    2023-06-25
  • Spring Data JPA实现查询结果返回map或自定义的实体类
    目录Spring Data JPA查询结果返回map或自定义的实体类1.工具类2.具体应用spingboot:jpa:Spring data jpa 返回map 结果集Spring ...
    99+
    2024-04-02
  • Spring Data Jpa多表查询如何返回自定义实体
    小编给大家分享一下Spring Data Jpa多表查询如何返回自定义实体,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SpringDataJ...
    99+
    2023-06-29
  • JPA如何使用nativequery多表关联查询返回自定义实体类
    目录JPA nativequery多表关联查询返回自定义实体类JPA多表关联的实现方式优缺点对比使用sql并返回自定义实体类JPA多表关联动态查询(自定义sql语句)实体类注解解释测...
    99+
    2024-04-02
  • JPA怎么使用nativequery多表关联查询返回自定义实体类
    这篇文章主要介绍了JPA怎么使用nativequery多表关联查询返回自定义实体类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JPA nativequery多表关联查询返回...
    99+
    2023-06-25
  • C#如何实现执行CMD命令并接收返回结果
    这篇文章主要介绍C#如何实现执行CMD命令并接收返回结果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!最近工作的时候发现软件里面通过查询ARP表查询某一IP对应的ARP条目的时,概率性出现查询到的ARP条目为空,一开...
    99+
    2023-06-14
  • JPA如何使用findBy方法自定义查询
    目录JPA使用findBy方法自定义查询在JPA中使用findBy方法自定义查询在postman测试请求的接口如下JPA的findBy语法整理前提操作JPA中支持的关键词JPA使用f...
    99+
    2024-04-02
  • JPA如何使用entityManager执行SQL并指定返回类型
    下面是代码 Query query = entityManager.createNativeQuery(yourSql); //指定返回类型 query.unwrap(SQLQu...
    99+
    2024-04-02
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2024-04-02
  • Java接口如何自定义使用
    本篇内容主要讲解“Java接口如何自定义使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java接口如何自定义使用”吧!一、引入一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方...
    99+
    2023-06-30
  • laravel中如何用dingo API返回自定义错误信息
    本篇内容主要讲解“laravel中如何用dingo API返回自定义错误信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“laravel中如何用dingo API返回自定义错误信息”吧!lara...
    99+
    2023-07-04
  • Layer如何做弹窗使用及返回数据接收
    这篇文章给大家分享的是有关Layer如何做弹窗使用及返回数据接收的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Layer做为弹窗,主页面代码:注意1. callback()方法 ...
    99+
    2024-04-02
  • 使用Spring Data JPA如何实现自定义规则查询
    使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or    &nbs...
    99+
    2023-05-31
    spring data jpa
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作