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

目录
  • SpringDataJPA查询结果返回map或自定义的实体类
    • 1.工具类
    • 2.具体应用
  • spingboot:jpa:Springdatajpa返回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();
    }
 

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

(0)

相关推荐

  • JPA自定义对象接收查询结果集操作

    最近使用JPA的时候,碰到需要自定义查询结果集的场景,网上搜了一下,都是需要自定义方法写一大串代码实现的,太繁琐了,有那时间还不如用mybaits. 用JPA就是要尽量通过声明接口解决持久层问题,要不然鬼用.逼得没办法去了官网看看文档,再没有就放弃了,没时间看源码.最终找到我想要的结果了. 例如,传统的JPA接口实现如下所示: class Person { @Id UUID id; String firstname, lastname; Address address; static class

  • springboot jpa 实现返回结果自定义查询

    目录 jpa返回结果自定义查询 第一种方法 第二种方法 使用jpa两张表联查返回自定义实体 1.创建一个SpringBoot空白项目,引入pom依赖 2.application.yml配置文件 3.数据库(有两张表user/address) 4.User.java和Address.java 5.UserDaoRepository.java和AddressDaoRepository.java 6.UserAddressDto.java代码 7.TestController.java jpa 返回结

  • SpringBoot Jpa 自定义查询实现代码详解

    这篇文章主要介绍了SpringBoot Jpa 自定义查询实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 持久层Domain public interface BaomingDao extends JpaRepository<BaomingBean,Integer> { @Query(value = "select distinct t.actid from BaomingBean t where t.belongs=?

  • 使用JPA自定义SQL查询结果

    目录 JPA自定义SQL查询结果 直接上代码 最后跑一下demo代码 JPA的SQL查询 一 点睛 二 JPA的NamedQuery查询 三 使用@Query查询 JPA自定义SQL查询结果 很多时候都会遇到自定义sql,自定义返回字段,而不是pojo类.这个情况要通过接口定义返回. 直接上代码 @Query(value = "select m.field AS field,COUNT(m.field) AS size from MigrationObject m where m.xmlName

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

    目录 Spring Data JPA查询结果返回map或自定义的实体类 1.工具类 2.具体应用 spingboot:jpa:Spring data jpa 返回map 结果集 Spring Data JPA查询结果返回map或自定义的实体类 在JPA中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句,并且JPA的底层实现都是支持返回Map对象的. 例如: EclipseLink 的 query.setHint(QueryHints.RESUL

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

    目录 SpringDataJPA查询结果返回map或自定义的实体类 1.工具类 2.具体应用 spingboot:jpa:Springdatajpa返回map结果集 Spring Data JPA查询结果返回map或自定义的实体类 在JPA中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句,并且JPA的底层实现都是支持返回Map对象的. 例如: EclipseLink 的 query.setHint(QueryHints.RESULT_TYPE

  • Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)

    目录 SpringDataJpa复杂查询总结 1.查找出Id小于3,并且名称带有shanghai的记录 2.通过旅店名称分页查询旅店以及城市的所有信息 3.HQL通过旅店名称查询旅店以及城市的所有信息 4.HQL通过旅店名称查询旅店以及城市的所有信息直接返回实体类 5.动态查询旅店以及城市的所有信息直接返回实体类 JPA#复杂查询#自定义查询 编写自定义SQL基于下面信息 基于最前面的信息,要编写自定义SQL Spring Data Jpa复杂查询总结 只是做一个总结所以就不多说废话了 实体类

  • Spring Data JPA 简单查询--方法定义规则(详解)

    一.常用规则速查 1 And 并且 2 Or   或 3 Is,Equals 等于 4 Between   两者之间 5 LessThan 小于 6 LessThanEqual   小于等于 7 GreaterThan 大于 8 GreaterThanEqual   大于等于 9 After 之后(时间) > 10 Before 之前(时间) < 11 IsNull 等于Null 12 IsNotNull,NotNull 不等于Null 13 Like 模糊查询.查询件中需要自己加 % 14

  • 详解Spring Data Jpa 模糊查询的正确用法

    模糊查询 Spring Data Jpa的使用可以减少开发者对sql语句的编写,甚至完全不需要编写sql语句.但是,开发过程中总会遇到各种复杂的场景以及大大小小的坑. 今天项目中某个功能模块需要用到模糊查询.原生sql中模糊查询关键字'Like',而Spring Data Jpa的Repository接口中恰恰也有实体字段对应的Like.但是,如果直接使用它,那么恭喜你,你幸运地掉坑了. Spring Data Jpa 模糊查询正确用法 首先,我们先创建一个实体用来存储我们的数据 /** * 实

  • 关于spring data jpa 模糊查询like的坑点

    目录 spring data jpa 模糊查询like坑点 spring data jpa like 查询问题 spring data jpa 模糊查询like坑点 在 ServiceImpl 中 调用, 不要忘记 % factoryinfoDao.findByFactorynameLike("%"+input+"%") spring data jpa like 查询问题 在使用Spring Data Jpa Like时 在继承JpaRepository的一个接口中

  • spring data jpa分页查询示例代码

    最近项目上用就hibernate+spring data jpa,一开始感觉还不错,但是随着对业务的复杂,要求处理一些复杂的sql,就顺便研究了下,把结果记录下,以便日后查看.用到Specification,需要继承JpaSpecificationExecutor接口.(下面代码有的分页从0开始作为第一页,有的从1开始作为作为第一页,我也忘记,请自己测试) DAO层: import java.util.List; import org.springframework.data.domain.Pa

  • Spring Data Jpa 中原生查询 REGEXP 的使用详解

    目录 Spring Data Jpa原生查询 REGEXP 的使用 spring data jpa 原生查询(查一个json中的某一字段) Spring Data Jpa原生查询 REGEXP 的使用 REGEXP 与like 有通用之处, 单 regexp 有更好的精确度,更加自由灵活 在jpa 中使用时 :其中 定位符 ^ 在jpa @query 注解中使用时需要加上引用号 e.g @Query(value = "select p.id as id from zt_products AS p

  • Spring Data JPA实现排序与分页查询超详细流程讲解

    目录 前言 1.创建持久化实体类 2.创建数据访问层 3.创建业务层 4.创建控制器类 5.创建View视图页面 6.运行主类 效果如下 前言 在实际开发场景中,排序与分页查询是必须的,幸运的是Spring Data JPA充分考虑了排序与分页查询的场景,为我们提供Sort类 Page接口 Pageable接口 下面通过一个实战来阐明 1.创建持久化实体类 创建名为com.ch.ch6_4.entity的包 并在该包中创建名为Article和Author的持久化实体类 代码如下 Article

  • 使用Spring Data JPA的坑点记录总结

    前言 Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支很大的部队,使用很广泛,也很方便,能力也很强,同时Hibernate也是和JPA整合的比较良好,我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行. 最近在

随机推荐