java - JPA/EntityManager有没有提供类似于Spring的RowMapper的机制

标签 java spring hibernate jpa entitymanager

我正在致力于标准化遗留代码库和新开发,以使用 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/

相关文章:

java - 如何运行 Fast Scala Compiler 远程服务器?

java - ConcurrentHashMap 每次读取时都锁定?

java - 如何在Spring Data Rest中为各种方法添加字段默认值?

java - 有没有办法在java项目中阻止EasyMock的良好控制?

java - FusionAuth授权

java - 比较不同 Hashmap 的键

java - 使用 XQJ JSR 225 的 Xquery

java - Hibernate ManyToMany 多个条目

java - 删除与另一个对象有manyTomany关系的对象

java hibernate标准在某人读取时锁定db2表