JPA 返回Map类型结果集

    昨天用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方面的书籍了。

猜你喜欢

转载自gy090028.iteye.com/blog/2023866
JPA