JPA 返回Map类型结果集
程序员文章站
2022-03-17 16:48:46
...
昨天用apache OpenJPA做一个全局dao的Java类, 但是 javax.persistence.Query接口中并没有提供一个可以返回Map类型结果集的方法,用本地化sql查询语句查询的结果如果没有指定返回的对象类型,那么返回的对象是一个Object类型的数组,这无疑对我们代码的编程和书写带来了麻烦.
顺便吐槽一下,Sun个土鳖三,出了接口本想统一编程方法,但这么重要的方法却在接口里面没有定义.哎~
查了半天,后来还是找到了解决的方法,不过这个方法在换了JPA实现之后,这部分代码还是得改动,并没有达到使用JPA的目的,希望能在后面的版本中添加返回Map的方法.
public class TestJPA { @PersistenceContext private EntityManager em; @Test public void doTest() { String sql = ""; Query query = em.createNativeQuery(sql); QueryImpl impl = query.unwrap(QueryImpl.class); impl.setResultClass(Map.class); List list = query.getResultList(); } }
如上代码中, query接口提供了一个 unwrap 方法,该方法传递一个Query的实现类可以返回当前Query的实现类实例, QueryImpl是openJPA的实现类,如果项目中用的是其他的ORM实现,可以在代码中选中Query按Ctrl+T 查看具体的实现类,在实现类中有设置返回类型为Map的方法.OpenJPA中设置 impl.setResultClass(Map.class)之后,此Query的查询结果就会是一个List<Map> 类型的结果集.
上面的方法有时候会返回一个Proxy对象,后来又查阅资料发现有个更简单的方法:
Query query = em.createNativeQuery(sql,java.util.Map.class);
这样就可以直接返回Map格式的结果集了。
都怪自己学艺不精,在上面瞎搞,看来得好好研读一下JPA方面的书籍了。