让JPA的Query查询接口返回Map对象的方法

 更新时间:2017年12月31日 09:52:03   作者:renjiaqi_500Server  
下面小编就为大家分享一篇让JPA的Query查询接口返回Map对象的方法,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在JPA 2.0 中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句。 但当我们查询结果没有对应实体类时,query.getResultList()返回的是一个List<Object[]>。也就是说每行的数据被作为一个对象数组返回。

常见的用法是这样的:

public void testNativeQuery(){
  Query query = entityManager.createNativeQuery("select id, name, age from t_user");
  List rows = query.getResultList();
  for (Object row : rows) {
    Object[] cells = (Object[]) row;
    System.out.println("id = " + cells[0]);
    System.out.println("name = " + cells[1]);
    System.out.println("age = " + cells[2]);
  }
}

这样用会使代码非常不容易让人理解, 究竟下标为0的元素到底是什么, 不去数查询语句是不知道的,而且一旦查询语句被调整,Java代码也要一起调整。这时候我们想如果返回的是Map的话,用起来会清晰的多。

可惜的是JPA的API中并没有提供这样的设置。其实很多JPA的底层实现都是支持返回Map对象的。

例如:

EclipseLink的query.setHint(QueryHints.RESULT_TYPE, ResultType.Map); 
Hibernate的.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

所以,如果我们想要返回Map并且确定底层用的是某一种JPA的实现时我们可以退而求其次, 牺牲跨实现的特性来满足我们的需求:

public void testNativeQuery(){
  Query query = entityManager.createNativeQuery("select id, name, age from t_user");
  query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  List rows = query.getResultList();
  for (Object obj : rows) {
    Map row = (Map) obj;
    System.out.println("id = " + row.get("ID"));
    System.out.println("name = " + row.get("NAME"));
    System.out.println("age = " + row.get("AGE"));
  }
}

Query返回指定entity返回类型的写法

Query query = entityManager.createNativeQuery("select id, name, age from t_user", User.Class); 

这里需要注意的是, 用Map肯定要比用Object数组来的效率低。所以你要看性能下降是否在可接受范围内。再就是在我的Hibernate 4.2.x的环境下,无论你原生SQL中写的是大写字母还是小写字母,返回的字段名都是大写的。当然你可以通过自定义ResultTransformer的形式对字段名进行一定的处理, 甚至是返回自己需要的POJO。

以上这篇让JPA的Query查询接口返回Map对象的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringMVC配置与使用详细介绍

    SpringMVC配置与使用详细介绍

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内配合
    2022-07-07
  • 基于SpringBoot+Redis的Session共享与单点登录详解

    基于SpringBoot+Redis的Session共享与单点登录详解

    这篇文章主要介绍了基于SpringBoot+Redis的Session共享与单点登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Idea中如何调出Run dashboard 或services窗口

    Idea中如何调出Run dashboard 或services窗口

    这篇文章主要介绍了Idea中如何调出Run dashboard 或services窗口问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java秒杀系统常见问题库存超卖解决实例分析

    java秒杀系统常见问题库存超卖解决实例分析

    这篇文章主要为大家介绍了java秒杀系统常见问题库存超卖解决实例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Springboot并发调优之大事务和长连接

    Springboot并发调优之大事务和长连接

    这篇文章主要介绍了Springboot并发调优之大事务和长连接,重点分享长事务以及长连接导致的并发排查和优化思路和示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • Java设计模式中的门面模式详解

    Java设计模式中的门面模式详解

    门面模式又叫外观模式(Facade Pattern),主要用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口,本文通过实例代码给大家介绍下java门面模式的相关知识,感兴趣的朋友一起看看吧
    2022-09-09
  • 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    我们在做服务器系统开发的时候,为了适应数据大并发的请求,需要插入数据库之前生成一个全局的唯一id,纠结全局唯一id怎么生成呢?下面小编给大家分享Java代码实现游戏服务器生成全局唯一ID的方法汇总,涉及到优劣势方面的知识点,对此感兴趣的朋友一起看看吧
    2016-10-10
  • Maven导入本地jar包的实现步骤

    Maven导入本地jar包的实现步骤

    本文主要介绍了Maven导入本地jar包的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java调用Oracle存储过程详解

    Java调用Oracle存储过程详解

    这篇文章主要介绍了Java调用Oracle存储过程详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • java开发AOP面向切面编程入门

    java开发AOP面向切面编程入门

    这篇文章主要介绍了java开发的AOP面向切面编程入门的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步学有所得
    2021-10-10

最新评论