让JPA的Query查询接口返回Map对象的方法
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
让JPA的Query查询接口返回Map对象的方法 JPA(Java Persistence API)是一种java持久层标准,提供了统一的数据访问机制。其中的Query查询接口是我们常用的数据查询方式。然而,在JPA 2.0中,使用entityManager.createNativeQuery()执行原生的SQL语句时,query.getResultList()返回的是一个List<Object[]>,每行数据被作为一个对象数组返回。这使得代码不容易让人理解,且不灵活。因此,本文将介绍让JPA的Query查询接口返回Map对象的方法。 我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句,并使用query.getResultList()获取查询结果。然而,query.getResultList()返回的是一个List<Object[]>,每行数据被作为一个对象数组返回。例如: ```java 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的实现时,我们可以退而求牺牲跨实现的特性来满足我们的需求: ```java 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")); } } ``` 需要注意的是,用Map肯定要比用Object数组来的效率低。所以你要看性能下降是否在可接受范围内。再就是在我的Hibernate 4.2.x的环境下,无论你原生SQL中写的是大写字母还是小写字母,返回的字段名都是大写的。 当然,你可以通过自定义ResultTransformer的形式对字段名进行一定的处理,甚至是返回自己需要的POJO。 让JPA的Query查询接口返回Map对象的方法可以使用unwrap()方法和setResultTransformer()方法来实现。这样可以使得代码更加清晰易懂,且灵活性更强。
- 粉丝: 6
- 资源: 929
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助