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

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 结果集

Spring Data JPA实现查询结果返回map或自定义的实体类

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();
    }
 

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