Spring Boot setResultTransformer和addScalar

时间:2019-01-06 10:50:53

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

我在使用entityManager对象返回查询结果集时遇到问题。 我想返回我的联接查询,该查询应转换为pojo对象。

因此,经过多次尝试,我发现了下面的工作代码

public List<Test> getData() {

    Query a = entityManager.createNativeQuery("select t1.data1,t2.data2 from test1 t1 join test2 t2 on t1.id = t2.id");          
    a.unwrap(SQLQuery.class)      
    .addScalar("data1", LongType.INSTANCE)      
    .addScalar("data2", DoubleType.INSTANCE)      
    .setResultTransformer(Transformers.aliasToBean(Test.class));     

    return a.getResultList();    
}

但是我警告过setResultTransformer()addScalar()方法已过时。
可以请其他人输入替代代码还是提供解决方案。
谢谢。

1 个答案:

答案 0 :(得分:1)

1)不赞成使用的第一件事是SQLQuery

  

(从5.2开始)改用NativeQuery

2)但这不能解决您的问题,因为SQLQuery.addScalar() org.hibernate.query.Query.setResultTransformer()也被弃用了。
From the Hibernate 5.3 migration guide

  

使用ResultTransformer可以定义a的结果   查询应进行处理,即可以用来更改查询的“形状”   查询结果。

     

在Hibernate 6.0中,ResultTransformer将被替换为   @FunctionalInterface,因此,setResultTransformer()   org.hibernate.query.Query中的方法已过时。

     

在Hibernate 5.3中无法替代ResultTransformer,   因此,按照此处的建议,目前可以原样使用。

因此,您可以保留它,并通过添加TODO注释来抑制警告。

@SuppressWarnings("deprecation")
public List<Test> getData() {

    Query a = entityManager.createNativeQuery(
            "select t1.data1,t2.data2 >from test1 t1 join test2 t2 on t1.id = t2.id");
    a.unwrap(NativeQuery.class)
      // TODO warning to remove with Hibernate 6 for addScalar()
     .addScalar("data1", LongType.INSTANCE)
     .addScalar("data2", DoubleType.INSTANCE)
      // TODO warning to remove with Hibernate 6 for setResultTransformer()
     .setResultTransformer(Transformers.aliasToBean(Test.class));

    return a.getResultList();
}