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

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

相关文章

  • spark中使用groupByKey进行分组排序的示例代码

    spark中使用groupByKey进行分组排序的示例代码

    这篇文章主要介绍了spark中使用groupByKey进行分组排序的实例代码,本文通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解JDK 5 Annotation 注解之@Target的用法介绍

    详解JDK 5 Annotation 注解之@Target的用法介绍

    这篇文章主要介绍了详解JDK 5 Annotation 注解之@Target的用法介绍,需要的朋友可以参考下
    2016-02-02
  • 利用ScriptEngineManager实现字符串公式灵活计算的方法

    利用ScriptEngineManager实现字符串公式灵活计算的方法

    今天小编就为大家分享一篇利用ScriptEngineManager实现字符串公式灵活计算的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Feign超时 在yml文件里的配置方式

    Feign超时 在yml文件里的配置方式

    这篇文章主要介绍了Feign超时 在yml文件里的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java 多线程死锁详解及简单实例

    java 多线程死锁详解及简单实例

    这篇文章主要介绍了java 多线程死锁详解及简单实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java知识梳理之泛型用法详解

    Java知识梳理之泛型用法详解

    从JDK 5.0以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型。本文就来和大家深入聊聊Java泛型的使用
    2022-08-08
  • SpringBoot集成消息队列的项目实践

    SpringBoot集成消息队列的项目实践

    本文主要介绍了SpringBoot集成消息队列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 手动添加jar包进Maven本地库内的方法

    手动添加jar包进Maven本地库内的方法

    这篇文章主要介绍了手动添加jar包进Maven本地库内的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot 整合 Quartz 定时任务框架详解

    SpringBoot 整合 Quartz 定时任务框架详解

    这篇文章主要介绍了SpringBoot整合Quartz定时任务框架详解,Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制
    2022-08-08
  • java中forward转发的使用

    java中forward转发的使用

    在Java中,forward转发是一种非常常见且重要的操作,我们将深入探讨forward的概念和用法,并给出一些代码示例来帮助读者更好地理解,感兴趣的可以了解下
    2023-11-11

最新评论