七叶笔记 » java编程 » springboot jpa 实现返回结果自定义查询

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

jpa 返回结果自定义查询

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

第一种方法

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

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

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

第二种方法

可以在特定的场合使用。

自定义类

这里是repository中的写法

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

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

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

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

pom.xml配置

2、application.yml配置文件

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

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

4、User.java 和 Address.java

5、UserDaoRepository.java 和 AddressDaoRepository.java

附上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_id2020-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:title2020-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:titleHibernate: 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=12020-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:titleHibernate: 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=12020-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@72cce81Hibernate: 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的方法体相当于调用了参数值,这样就会把数据取出来

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

相关文章