我正在致力于标准化遗留代码库和新开发,以使用 EntityManager 实现持久性。然而,为了成功,我需要提供分解为 native 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);
感谢您的帮助。
最佳答案
实现此目的的一种方法是通过 Hibernate session (前提是您使用的是 Hibernate)并使用其 https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/transform/ResultTransformer.html .代码应如下所示,您不需要遍历列表两次:
List<MyDto> result = entityManager.unwrap(org.hibernate.Session.class)
.createSQLQuery("select ... from my_table where ...")
.setParameter("my_param", "my_param_value")
.setResultTransformer(org.hibernate.transform.Transformers.aliasToBean(MyDto.class))
.list();
希望这对您有所帮助。
关于java - JPA/EntityManager有没有提供类似于Spring的RowMapper的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088081/