【发布时间】:2015-07-17 06:13:41
【问题描述】:
我正在致力于标准化遗留代码库和新开发以使用 EntityManager 进行持久性。然而,为了成功,我需要提供分解为原生 SQL 并手动处理结果的能力。 JPA EntityManager 几乎通过以下方式提供此功能:
em.createNativeQuery("select ... from my_table where ...");
但我缺少的是执行 Spring 风格的 RowMappers 的能力。我可以看到有一些机制很接近。我当然可以使用注释、xml 等映射实体,但我需要将代码放入结果集中每一行的处理中,所以这不是一个选项。我可以看到我可以传入 SQLResultSetMapping,但据我所知,这再次仅支持元数据映射。理想情况下,我需要以下内容:
em.createNativeQuery("select ... from my_table where ...",
new RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
MyObject o = new MyObject();
o.setMyCustomProperty( rs.get...() );
//...
return b;
}
}
);
是否存在与上述等价的内容?我可以构造一个 SQLResultSetMapping 来完全控制上面的映射吗?
如果没有,我是否可以至少以标准方式获取 EM 底层的数据源,以便我可以使用 JdbcTemplate 包装它并且没有两条路径来配置数据源?
DataSource ds = em.getDataSource();
JdbcTemplate t = new JdbcTemplate(ds);
感谢您的帮助。
【问题讨论】:
-
您的 SQL 查询返回一个 List
-
是的,谢谢。我试图避免这种情况,以避免在结果集上循环两次的开销。我假设 JPA 堆栈迭代结果集以构建 List
-
List
标签: java spring hibernate jpa entitymanager