我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot jpa如何实现返回结果自定义查询

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot jpa如何实现返回结果自定义查询

这篇文章主要讲解了“springboot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot jpa如何实现返回结果自定义查询”吧!

jpa 返回结果自定义查询

这里自定义的实体是没有在数据映射的实体。可以返回聚合函数的值。

第一种方法

实体类。(这里本人使用的是idea)

@Datapublic class NameOnlyDto   implements Serializable {    private  String  firstName;    private  String  lastName;    private  String  sex ;}

repository类(这里不是 使用的继承jpa中的 的方式。而是使用的EntityManager)。代码中有详细的注释。

@Repositorypublic class CustomEntity {    // 实体管理器EntityManager是负责管理Entity的对象。对Entity的操作包括添加、删除、修改和查询,都是通过实体管理器来实现的。    @PersistenceContext    private EntityManager entityManager;     //EntityManagerFactory     @Transactional    public List<NameOnlyDto> listNameOnlyDto(){        String sql = "select p.last_name lastName, p.first_name firstName from PERSON p";        // hibernate 5.2 之前        // SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class);        // hibernate 5.2 之后的 写法         // unwrap 让JPA的Query返回Map对象 javax.persistence.Query.unwrap        // hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰        SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class);                 Query query =                sqlQuery.setResultTransformer(Transformers.aliasToBean(NameOnlyDto.class));         List<NameOnlyDto>  list =query.getResultList();        entityManager.clear();        return list;    }}

OK。就这样就可以了。个人测试似乎在oracle数据库 不行。可能是sql查询结果不太一样

第二种方法

可以在特定的场合使用。

自定义类

public class NameOnlyDtoT implements Serializable {    private  String  firstName;    private  String  lastName;    // private  String  address;    private  String  sex;    //构造函数 特殊注意 这里返回几个字段就要有几个字段的构造参数 感觉不太合适的地方    public NameOnlyDtoT(String firstName, String lastName) {        this.firstName = firstName;        this.lastName = lastName;    }   }

这里是repository中的写法

// 切记不能使用@query.如果使用@query 个人感觉和上面那种方法是一样的逻辑List<T> findByLastName(String lastname,Class<T> type);        使用(这里注意的是NameOnlyDtoT 中字段能赋值的只能是person中 含有的字段。这是个人觉得鸡肋的存在)    public  List<NameOnlyDtoT>  testNameOnlyDtoTS(){        List<NameOnlyDtoT>  nameOnlyDtoTS= personRepository.findByLastName("哈哈", NameOnlyDtoT.class);      return nameOnlyDtoTS;}

使用jpa两张表联查返回自定义实体

在java开发中,用Jpa框架做连表查询时(需要返回两张表的各自部分字段),在返回对象的过程中感觉比较棘手,一直没有一个好的解决方案,网上也有各种版本的方法,下面的方法本人感觉最方便使用

1、创建一个SpringBoot空白项目,引入pom依赖

先看项目结构,为了简化,没有引入service层,直接使用controller调用dao层

springboot jpa如何实现返回结果自定义查询

pom.xml配置

        <!-- web依赖 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!--  lombok依赖 -->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.8</version>        </dependency>        <!-- jpa依赖 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency>        <!-- mysql依赖 -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <scope>runtime</scope>        </dependency>

2、application.yml配置文件

server:  port: 13333spring:  datasource:    url: jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull    username: root    password: 12345678    driver-class-name: com.mysql.jdbc.Driver  jpa:    show-sql: true    hibernate:      ddl-auto: none

3、数据库(有两张表user/address)

springboot jpa如何实现返回结果自定义查询

我们现在需要联查user和address表,address表中的user_id是和user表中id是做关联查询

4、User.java 和 Address.java

springboot jpa如何实现返回结果自定义查询

5、UserDaoRepository.java 和 AddressDaoRepository.java

springboot jpa如何实现返回结果自定义查询

附上UserDaoRepository.java的代码

package com.lss.jpa.dao;import com.lss.jpa.entity.dto.UserAddressDto;import com.lss.jpa.entity.po.User;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import java.util.List;import java.util.Map;public interface UserDaoRepository extends JpaRepository<User, Integer> {    @Query(value = "select \"title\" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id", nativeQuery = true)    public List<UserAddressDto> findAllUserAddress();    @Query(value = "select \"title\" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id and u.id=1", nativeQuery = true)    public UserAddressDto findAllUserAddressById();    @Query(value = "select \"title\" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id and u.id=1", nativeQuery = true)    public Map<String, Object> findAllUserAddressByMap();}

6、UserAddressDto.java代码

package com.lss.jpa.entity.dto;public interface UserAddressDto {    Integer getId();    String getName();    String getAddressName();    Integer getAddressId();    String getCommon();}

此处我们自定义了UserAdressDto来接收两张表返回的数据,注意:此时创建的是一个interface,并且里面的字段是用get的形式创建的接收参数

7、TestController.java

package com.lss.jpa.web;import com.lss.jpa.dao.UserDaoRepository;import com.lss.jpa.entity.dto.UserAddressDto;import com.lss.jpa.entity.po.User;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;@RestController@Slf4jpublic class TestController {    @Autowired    private UserDaoRepository userDaoRepository;    @GetMapping("test")    public String test(){        List<UserAddressDto> all = userDaoRepository.findAllUserAddress();        all.stream().forEach(dto -> {            log.info("result: id:{}, name:{}, addressId:{}, addressName:{}, common:{}", dto.getId(), dto.getName(), dto.getAddressId(), dto.getAddressName(), dto.getCommon());        });        UserAddressDto dto = userDaoRepository.findAllUserAddressById();        log.info("result: id:{}, name:{}, addressId:{}, addressName:{}, common:{}", dto.getId(), dto.getName(), dto.getAddressId(), dto.getAddressName(), dto.getCommon());        Map<String, Object> map = userDaoRepository.findAllUserAddressByMap();        log.info("map:{}", map);        List<User> userList = userDaoRepository.findAll();        log.info("userList:{}", userList);        return "ok";    }}

最后,启动项目,调用/test接口

curl http://localhost:13333/test

看console里打印结果

Hibernate: select "title" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id
2020-02-23 13:14:33.293  INFO 2816 --- [io-13333-exec-3] com.lss.jpa.web.TestController           : result: id:1, name:zhangsan , addressId:1, addressName:beijing, common:title
2020-02-23 13:14:33.293  INFO 2816 --- [io-13333-exec-3] com.lss.jpa.web.TestController           : result: id:2, name:lisi, addressId:2, addressName:tianjin, common:title
Hibernate: select "title" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id and u.id=1
2020-02-23 13:14:33.296  INFO 2816 --- [io-13333-exec-3] com.lss.jpa.web.TestController           : result: id:1, name:zhangsan , addressId:1, addressName:beijing, common:title
Hibernate: select "title" as common, u.id as id, u.name as name, a.id as addressId, a.address as addressName from user u, address a where u.id = a.user_id and u.id=1
2020-02-23 13:14:33.299  INFO 2816 --- [io-13333-exec-3] com.lss.jpa.web.TestController           : map:org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap@72cce81
Hibernate: select user0_.id as id1_1_, user0_.name as name2_1_ from user user0_
2020-02-23 13:14:33.305  INFO 2816 --- [io-13333-exec-3] com.lss.jpa.web.TestController           : userList:[User(id=1, name=zhangsan ), User(id=2, name=lisi), User(id=3, name=wangwu), User(id=4, name=zhaoliu)]

我们可以拷到输出的sql和联查出来的数据结果,都被dto完美接收

特别注意,接收的dto一定要是interface,里面的参数要写成get形式的方法体,这样jpa在查询到数据后,会自动映射到interface里,通过调用get的方法体相当于调用了参数值,这样就会把数据取出来

感谢各位的阅读,以上就是“springboot jpa如何实现返回结果自定义查询”的内容了,经过本文的学习后,相信大家对springboot jpa如何实现返回结果自定义查询这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

springboot jpa如何实现返回结果自定义查询

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

下载Word文档

猜你喜欢

springboot jpa如何实现返回结果自定义查询

这篇文章主要讲解了“springboot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot jpa如何实现返回结果自定义查询”吧!jpa 返
2023-06-29

Spring Data Jpa多表查询如何返回自定义实体

小编给大家分享一下Spring Data Jpa多表查询如何返回自定义实体,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SpringDataJpa多表查询返回自定
2023-06-29

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

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

JPA怎么使用nativequery多表关联查询返回自定义实体类

这篇文章主要介绍了JPA怎么使用nativequery多表关联查询返回自定义实体类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JPA nativequery多表关联查询返回
2023-06-25

使用Spring Data JPA如何实现自定义规则查询

使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or     或3
2023-05-31

SpringBoot如何实现统一封装返回前端结果集

这篇文章主要介绍了SpringBoot如何实现统一封装返回前端结果集的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot如何实现统一封装返回前端结果集文章都会有所收获,下面我们一起来看看吧。我们如
2023-07-02

利用Spring Boot框架如何实现跨域与自定义查询功能

利用Spring Boot框架如何实现跨域与自定义查询功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。跨域请求定义:当我们从本身站点请求不同域名或端口的服务所提供的资源时
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录