欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPA 返回Map类型结果集

程序员文章站 2022-03-17 16:53:28
...

    昨天用apache OpenJPA做一个全局dao的Java类, 但是 javax.persistence.Query接口中并没有提供一个可以返回Map类型结果集的方法,用本地化sql查询语句查询的结果如果没有指定返回的对象类型,那么返回的对象是一个Object类型的数组,这无疑对我们代码的编程和书写带来了麻烦.

    顺便吐槽一下JPA 返回Map类型结果集
            
    
    博客分类: ORM  ,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方面的书籍了。