让JPA的Query查询接⼝返回Map对象的⽅法
在JPA 2.0 中我们可以使⽤ateNativeQuery()来执⾏原⽣的SQL语句。但当我们查询结果没有对应实体类时,ResultList()返回的是⼀个List<Object[]>。也就是说每⾏的数据被作为⼀个对象数组返回。
常见的⽤法是这样的:
public void testNativeQuery(){
Query query = ateNativeQuery("select id, name, age from t_user");
List rows = ResultList();
for (Object row : rows) {
Object[] cells = (Object[]) row;
System.out.println("id = " + cells[0]);
System.out.println("name = " + cells[1]);
jpa mybatis
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 = ateNativeQuery("select id, name, age from t_user");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List rows = ResultList();
for (Object obj : rows) {
Map row = (Map) obj;
System.out.println("id = " + ("ID"));
System.out.println("name = " + ("NAME"));
System.out.println("age = " + ("AGE"));
}
}
Query返回指定entity返回类型的写法
Query query = ateNativeQuery("select id, name, age from t_user", User.Class);
这⾥需要注意的是,⽤Map肯定要⽐⽤Object数组来的效率低。所以你要看性能下降是否在可接受范围内。再就是在我的Hibernate 4.2.x的环境下,⽆论你原⽣SQL中写的是⼤写字母还是⼩写字母,返回的字段名都是⼤写的。当然你可以通过⾃定义ResultTransformer的形式对字段名进⾏⼀定的处理,甚⾄是返回⾃⼰需要的POJO。
以上这篇让JPA的Query查询接⼝返回Map对象的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论