在Spring Boot 2.0中如何获取选择结果作为List <Map <String,Object >>

时间:2019-08-14 11:11:16

标签: hibernate spring-boot spring-data-jpa

我们正在尝试从Spring Boot 1.5.x迁移到2.0.x

以下是用于使用Spring Boot 1.5.x作为List>获得选择结果的代码:

public List<Map<String, Object>> findZipCodeAndCityByState(String state) {
    String sql = "SELECT DISTINCT z.city, z.zip_code FROM zip_code z WHERE z.state = :state";
    Query qr = entityManager.createNativeQuery(sql);
    qr.setParameter("state", state);

    // BELOW LINES WILL GIVE US THE MAP OF PROPERTIES
    org.hibernate.Query hibernateQuery = ((org.hibernate.jpa.HibernateQuery) qr).getHibernateQuery();
    hibernateQuery.setResultTransformer(AliasToEntityOrderedMapResultTransformer.INSTANCE);

    return qr.getResultList();
}

但是当我们尝试迁移到2.0.x时,要知道org.hibernate.Query和hibernateQuery.setResultTransformer()均已弃用。

如何在Spring Boot 2.0中以List>的形式获得选择结果?

1 个答案:

答案 0 :(得分:0)

您有以下选择:

  1. 使用Hibernate的ResultSetTransformer继续。如果JPA规范中存在丑陋的等价功能,则不建议使用某些Hibernate功能,但是当使用Hibernate API为您提供更多JPA功能时,您可以轻松找到很多地方。建议不要在自己的Query上致电unwrap

  2. 改为使用List<Tuple>。要使用Tuple,您需要使用createNativeQuery的重载版本,并将Tuple.class作为结果类传递

  3. 使用DTO投影

一篇很好的文章,总结了所有三种方法: The best way to map a projection query to a DTO (Data Transfer Object) with JPA and Hibernate