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)
    https://www.cnblogs.com/jpfss/p/11162135.html
    在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充。

参考:
JPA、Hibernate、Spring data jpa之间的关系
https://www.cnblogs.com/jpfss/p/11162135.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值