iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot jpa如何实现返回结果自定义查询
  • 581
分享到

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

2023-06-29 07:06:48 581人浏览 安东尼
摘要

这篇文章主要讲解了“SpringBoot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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如何实现返回结果自定义查询这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: springboot jpa如何实现返回结果自定义查询

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

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

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

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

下载Word文档
猜你喜欢
  • springboot jpa 实现返回结果自定义查询
    目录jpa 返回结果自定义查询第一种方法第二种方法使用jpa两张表联查返回自定义实体1、创建一个SpringBoot空白项目,引入pom依赖2、application.yml配置文件...
    99+
    2022-11-13
  • springboot jpa如何实现返回结果自定义查询
    这篇文章主要讲解了“springboot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot jpa如何实现返回结果自定义...
    99+
    2023-06-29
  • Spring Data JPA实现查询结果返回map或自定义的实体类
    目录Spring Data JPA查询结果返回map或自定义的实体类1.工具类2.具体应用spingboot:jpa:Spring data jpa 返回map 结果集Spring ...
    99+
    2022-11-12
  • Spring Data Jpa多表查询如何返回自定义实体
    小编给大家分享一下Spring Data Jpa多表查询如何返回自定义实体,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SpringDataJ...
    99+
    2023-06-29
  • 如何使用JPA自定义VO接收返回结果集
    这篇文章主要介绍如何使用JPA自定义VO接收返回结果集,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JPA自定义VO接收返回结果集(unwrap)JPA跟mybitis比较,简单的业务搜索是方便的,但是设计到复杂的S...
    99+
    2023-06-25
  • JPA如何使用nativequery多表关联查询返回自定义实体类
    目录JPA nativequery多表关联查询返回自定义实体类JPA多表关联的实现方式优缺点对比使用sql并返回自定义实体类JPA多表关联动态查询(自定义sql语句)实体类注解解释测...
    99+
    2022-11-12
  • JPA怎么使用nativequery多表关联查询返回自定义实体类
    这篇文章主要介绍了JPA怎么使用nativequery多表关联查询返回自定义实体类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JPA nativequery多表关联查询返回...
    99+
    2023-06-25
  • 使用Spring Data JPA如何实现自定义规则查询
    使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or    &nbs...
    99+
    2023-05-31
    spring data jpa
  • SpringBoot如何实现统一封装返回前端结果集
    这篇文章主要介绍了SpringBoot如何实现统一封装返回前端结果集的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot如何实现统一封装返回前端结果集文章都会有所收获,下面我们一起来看看吧。我们如...
    99+
    2023-07-02
  • 利用Spring Boot框架如何实现跨域与自定义查询功能
    利用Spring Boot框架如何实现跨域与自定义查询功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。跨域请求定义:当我们从本身站点请求不同域名或端口的服务所提供的资源时...
    99+
    2023-05-31
    springboot 自定义查询 跨域
  • 微信小程序使用自定义tabbar 想要获取tabbar的高度,返回的结果是null,该如何获取?
    在使用自定义tabbar时,你可能会需要获取tabbar的高度,但是按照网上的方法却得不到正确的结果,这让你十分头疼。那么该怎么办呢?小编为大家整理了以下几个方法,希望能够帮到大家。 1️⃣ 使用wx.getSystemInfoSync()...
    99+
    2023-10-27
    微信小程序 小程序
  • 微信小程序如何实现胶囊按钮返回|首页自定义导航栏功能
    这篇文章主要介绍了微信小程序如何实现胶囊按钮返回|首页自定义导航栏功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在小程序中,从转发出来的...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作