欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-26 17:14:11
jpa 返回结果自定义查询这里自定义的实体是没有在数据映射的实体。可以返回聚合函数的值。(个人理解可以。。。。。。)第一种方法实体类。(这里本人使用的是idea)repository类(这里不是 使用...

jpa 返回结果自定义查询

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

第一种方法

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

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

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

第二种方法

可以在特定的场合使用。

自定义类

这里是repository中的写法

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

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

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

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

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

pom.xml配置

2、application.yml配置文件

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的代码

6、useraddressdto.java代码

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

7、testcontroller.java

最后,启动项目,调用/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的方法体相当于调用了参数值,这样就会把数据取出来

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。