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

 更新时间:2021年12月08日 14:43:58   作者:ruoxiyun  
这篇文章主要介绍了Spring Data JPA实现查询结果返回map或自定义的实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

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

相关文章

  • SpringBoot2整合Drools规则引擎及案例详解

    SpringBoot2整合Drools规则引擎及案例详解

    这篇文章主要介绍了SpringBoot2整合Drools规则引擎及案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 又一波Java专业人士必备书籍来袭

    又一波Java专业人士必备书籍来袭

    又一波Java专业人士必备书籍来袭,这篇文章主要向大家推荐了Java专业人士必读的书,感兴趣的小伙伴们不要错过
    2016-09-09
  • SpringCloud实现灰度发布的方法步骤

    SpringCloud实现灰度发布的方法步骤

    本文主要介绍了SpringCloud实现灰度发布的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Mybatis控制台打印Sql语句的实现代码

    Mybatis控制台打印Sql语句的实现代码

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,下面给大家介绍Mybatis控制台打印Sql语句的实现代码,非常不错,感兴趣的朋友一起看下吧
    2016-07-07
  • 如何为Spark Application指定不同的JDK版本详解

    如何为Spark Application指定不同的JDK版本详解

    这篇文章主要给大家介绍了关于如何为Spark Application指定不同的JDK版本的相关资料,文中通过示例代码将解决的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来随着小编一起学习学习吧。
    2017-11-11
  • Spring中的代理ProxyFactory解析

    Spring中的代理ProxyFactory解析

    这篇文章主要介绍了Spring中的ProxyFactory解析,在Java中,代理模式的实现通常依靠Proxy类和InvocationHandler接口,本文将介绍如何使用ProxyFactory来创建代理模式,需要的朋友可以参考下
    2023-12-12
  • Springmvc文件上传实现流程解析

    Springmvc文件上传实现流程解析

    这篇文章主要介绍了Springmvc文件上传实现流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    这篇文章主要为大家介绍了Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot使用Log4j过程详解

    SpringBoot使用Log4j过程详解

    这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java支持方法重载的原因

    Java支持方法重载的原因

    今天给大家带来的是关于Java的相关知识,文章围绕着Java方法重载展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论