spring data 返回任意字段
在spring boot + spring data查询数据库的过程中,有时候总会出现一些复杂的查询,我们希望数据库返回的字段能随意改变。这个需求在mybatis里很好解决,只需要用map接收就可以,但在用spring data的时候有些麻烦。今天来讨论一下可选的方案。基于spring boot 1.5.15.RELEASE 和 2.2.1.RELEASE。
spring boot 版本 1.5.15.release
一、官方推荐的做法interface-based Projections 和 class-based Projections
interface-based Projections
1、根据数据库要返回的字段,建立一个interface,实现各个字段的get方法
interface SomeDto{
Long getId();
String getName();
Date getCreateTime();
}
2、在repository中,写nativeQuery查询,并以上面新建的interface作为返回对象
@Query(nativeQuery=true,value="SELECT id,name,create_time FROM table")
List<SomeDto> find();
3、spring boot会把查询的结果集的每一条记录,对应到SomeDto中,并为其创建一个代理对象(proxy instance)。然后你可以将其当作一般对象,从里面获取数据。
List<SomeDto> dtoList = repository.find();
String name1 = dtoList.get(0).getName();
System.out.println(name1);
class-based Projections
上述查询方式,根据官方文档,也可以基于普通的class。但是我在尝试的过程中,总是报错,放弃。
参考
1、https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.dtos(5.3.11.Projections)
2、https://stackoverflow.com/questions/29082749/spring-data-jpa-map-the-native-query-result-to-non-entity-pojo?r=SearchResults
其他方式,可行但不推荐的方式
二、在repository中写sql,返回Object[]
@Query(nativeQuery=true, value = "SELECT id,name,create_time FROM table")
List<Object[]> find();
返回的结果集的每一条记录,都是一个Object[],数组的0、1、2。。。等位置分别顺序对应查询的字段。
三、在repository中写hql,返回Map
@Query(nativeQuery=false, value = "SELECT new map(id,name,create_time) FROM table")
List<Map> findSome();
查询用了hql,如果是简单查询还好。如果涉及多表联查或是聚合函数,还需要查hql的对应语法,很麻烦。
而且,表面上,返回的是Map,其实它还是一个Object[],因为map的key不是数据库字段,而是数组下标。
四、使用EntityManager,
String sql = "SELECT id,name,create_time FROM table";
Query query = entityManager.createNativeQuery(sql);
query.unwrap(SQLQuery.class).setResultTransformer(Transformer.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.getResultList();
这个方法,可以正常的将sql查询结果转换成map,并且map的key就是数据库查询的字段的名字。然而需要使用entityManager,不能直接在repository中写sql,写法非常啰嗦。
spring boot 版本 2.2.1.RELEASE
1、此版本的spring data,在repository中进行nativeQuery sql查询,可以直接将,查询字段映射到map,并且map的key就是数据库的字段。
@Query(nativeQuery=true, value = "SELECT id,name,create_time FROM table")
List<Map<String,Object>> find();
List<Map<String,Object>> list = repository.find();
String name1 = list.get(0).get("name");
System.out.println(name1);
spring data 返回任意字段的更多相关文章
- spring data jpa自定义bean字段映射
当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最 ...
- Spring data jpa 调用存储过程处理返回参数及结果集
一.环境 1.此随笔内容基于spring boot整合的spring data jpa项目, 2.数据库为mysql 5.7.9版本 二.内容 1. 新建存储过程 pro_query_object B ...
- spring data jpa查询部分字段、多余附加字段
spring data jpa查询部分字段 第一种方法:使用 model 查询时转化 首先建立一个 model ,写上自己想要查询的字段,然后写上构造函数,这步很重要,因为spring jpa 转化时 ...
- spring data jpa 查询部分字段列名无效问题
spring data jpa原生sql查询问题,我只要表其中的几个字段的值,本以为写个原生sql,拿实体类对象去接没问题 结果列名无效,测试了一下,把返回值类型改成List<Object> ...
- Spring data jpa中Query和@Query分别返回map结果集
引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...
- 如何在Spring Data MongoDB 中保存和查询动态字段
原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- 关于Spring Data JPA更新部分字段的问题
1.问题背景 个人比较喜欢Spring data JPA,这次的问题是在实体类中使用List类型作为字段,JPA也提供了操作的方法,即使用@ElementCollection注解,网上对于JPA的知识 ...
- Spring Data Rest如何暴露ID字段
package com.example.demo.config; import com.example.demo.model.Comp; import com.example.demo.model.P ...
随机推荐
- [HNOI2004][bzoj1211] 树的计数(prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...
- mysql清表时有外键关联处理办法
可以忽视关联的情况下: 先取消主外键关系验证:SET FOREIGN_KEY_CHECKS = 0; 然后删除需要删除的数据:truncate table table_name; 最后恢复:SET F ...
- Python3中tornado高并发框架
1.单线程tornado.web:基础web框架模块tornado.ioloop:核心IO循环模块,高效的基础.封装了:1.asyncio 协程,异步处理2. epoll模型:水平触发(状态改变就询问 ...
- 修改hive 默认fs为s3 遇到的坑
问题: hive我修改了 默认的f <property> <name>fs.defaultFS</name> <value>hdfs://...:802 ...
- 「JOI 2019 Final」 硬币收藏
题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...
- 异常处理(Exception Handling)
java里的异常处理(Exception)Exception 是在程序执行过程中发生的一些不希望发生的事情,这些事情如果不被好好处理,就会导致奇怪的结果或者是程序终结.Exception Handle ...
- 微信小程序 改变radio(单选钮)默认大小
/* 单选钮样式 */ radio { transform:scale(0.5); }
- TCP输入 之 tcp_queue_rcv
tcp_queue_rcv用于将接收到的skb加入到接收队列receive_queue中,首先会调用tcp_try_coalesce进行分段合并到队列中最后一个skb的尝试,若失败则调用__skb_q ...
- 石川es6课程---9、面向对象-基础
石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...
- 9.关联规则那不行fizi麸子
1.关联规则概述 2.关联规则算法罗兵烙饼选择 3.关联规则的算法