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 ...
随机推荐
- jQuery.post(url, [data], [callback], [type])
jQuery.post(url, [data], [callback], [type]) 概述 通过远程 HTTP POST 请求载入信息. 这是一个简单的 POST 请求功能以取代复杂 $.ajax ...
- C语言 - sizeof和strlen的区别
sizeof和strlen的区别: 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.s ...
- CDQ分治学习思考
先挂上个大佬讲解,sunyutian1998学长给我推荐的mlystdcall大佬的[教程]简易CDQ分治教程&学习笔记 还有个B站小姐姐讲解的概念https://www.bilibili.c ...
- 创建虚拟机,安装操作系统,xshell6远程链接
一.创建虚拟机 1. 首先安装vmware,注意在安装中,下面的两项不要勾选,一路下一步 2.完成安装打开之后,创建新的虚拟机 3.虚拟机创建完成,需要改配置 4.然后设置网段 5.查看服务,在运行状 ...
- 推荐系统系列(一):FM理论与实践
背景 在推荐领域CTR(click-through rate)预估任务中,最常用到的baseline模型就是LR(Logistic Regression).对数据进行特征工程,构造出大量单特征,编码之 ...
- Vue_(组件通讯)单项数据流
Vue单项数据流 传送门 单向数据流:父组件值的更新,会影响到子组件,反之则不行 修改子组件的值: 局部数据:在子组件中定义新的数据,将父组件传过来的值赋值给新定义的数据,之后操作这个新数据 如果对数 ...
- eclipse外部导入Javaweb项目时,项目上出现红叉的一个可能的解决办法
解决办法:http://blog.csdn.net/qq_32671287/article/details/52467885 进入项目包下的.settings目录,找到org.eclipse.wst. ...
- 深入聚焦 call,apply 和 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- 【转】Microsoft SQL Server 2008 R2 官方简体中文正式版下载(附激活序列号密钥)
原文: https://www.bensblog.cn/1238.html
- ExpectedConditions API
使用 public boolean isPresent(String xpath, int waitingTimeInSec) { try { WebDriverWait wait = new Web ...