Spring Data JPA实现查询结果返回map或自定义的实体类
程序员文章站
2022-06-23 13:34:43
目录spring data jpa查询结果返回map或自定义的实体类1.工具类2.具体应用spingboot:jpa:spring data jpa 返回map 结果集spring data jpa查...
spring data jpa查询结果返回map或自定义的实体类
在jpa中我们可以使用entitymanager.createnativequery()来执行原生的sql语句,并且jpa的底层实现都是支持返回map对象的。
例如:
eclipselink 的 query.sethint(queryhints.result_type, resulttype.map); hibernate 的query.unwrap(sqlquery.class).setresulttransformer(transformers.alias_to_entity_map); openjpa 的 queryimpl impl = q.unwrap(queryimpl.class); impl.setresultclass(map.class);
本文中使用的是spring data jpa(spring data jpa 可以理解为 jpa 规范的再次封装抽象,底层还是使用了 hibernate 的 jpa 技术实现),遂用 hibernate 的query.unwrap(sqlquery.class).setresulttransformer(transformers.alias_to_entity_map)。
1.工具类
@component public class entitymanagerutil<t> { @persistencecontext private entitymanager entitymanager; //1.返回map public list<map<string, object>> getlistmap(string sql){ query nativequery=entitymanager.createnativequery(sql); nativequery.unwrap(sqlquery.class).setresulttransformer(transformers.alias_to_entity_map); list resultlist=nativequery.getresultlist(); return resultlist; } //2.返回自定义实体类 public list<t> nativequeryresult(string sql, class clazz) { sql = normalizer.normalize(sql, normalizer.form.nfkc); sql = sql.replaceall(".*([';]+|(--)+).*", ""); query query = entitymanager.createnativequery(sql); list<t> querylist = query.unwrap(sqlquery.class).setresulttransformer(transformers.aliastobean(clazz)).list(); return querylist; } }
2.具体应用
//1.自动注入 @autowired private entitymanagerutil entitymanagerutil; //1.返回map string sql="sql语句"; list<map> list=entitymanagerutil.getlistmap(sql); //2.1 返回自定义实体类(方法一) list<实体类> list = entitymanagerutil.nativequeryresult(sql, 实体类.class); //2.2 返回自定义实体类(方法二 hql)
在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充。
spingboot:jpa:spring data jpa 返回map 结果集
@persistencecontext private entitymanager em; /** * 通过时间范围查询职位统计结果 * @param startmonth * @param endmonth * @return */ @override public string querypositionbymonthofyear(string startmonth, string endmonth) { int sumnewposn =0; int sumcurrposn =0; int dailyaverage =0; map<string, object> resultmap=null; jsonobject jo =null; jsonobject jod =null; string endmonthtmp=null; list<map<string,object>> lis = null; try { int tmp = integer.valueof(endmonth.split("-")[1])+1; endmonthtmp=integer.valueof(endmonth.split("-")[0])+"-"+tmp; string sql = "select left(statistic_time,7) time ,sum(new_position) newposition ,sum(curr_position) nowrecruitposition from t_cal_positions " + "where statistic_time > '"+startmonth+"' and statistic_time <'"+endmonthtmp+"' group by left(statistic_time,7)"; query query = em.createnativequery(sql); query.unwrap(org.hibernate.sqlquery.class) .setresulttransformer(transformers.alias_to_entity_map); list<map<string, object>> rows = query.getresultlist(); if(null!=rows && rows.size()>0){ resultmap = new hashmap<string, object>(); lis= new arraylist<map<string,object>>(); for (map<string, object> map : rows) { if(map.get("time").equals(endmonth)){ // int daynum = dateutil.getdayofmonth(integer.valueof(endmonth.split("-")[0]),integer.valueof(endmonth.split("-")[1])); dailyaverage=integer.valueof(string.valueof(map.get("nowrecruitposition")))/dateutil.getdateofmonth(); } lis.add(map); } jo = new jsonobject(); jod = new jsonobject(); jod.put("dailyaverage",dailyaverage); jod.put("list",lis); jo.put("code", enumhttpstatustype.success.getcode()); jo.put("msg",enumhttpstatustype.success.getstatus()); jo.put("data",jod); return jo.tostring(); } } catch (exception e) { e.printstacktrace(); } return jo.tostring(); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。