首页 > 解决方案 > 春季启动 setResultTransformer 和 addScalar

问题描述

我在使用 entityManager object 返回查询结果集时遇到问题。我想返回我的连接查询,它应该转换成 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()方法已被弃用。
任何人都可以输入它的替代代码或提供解决方案。
谢谢。

标签: springhibernatespring-bootspring-data-jpa

解决方案


1) 弃用的第一件事是SQLQuery

(自 5.2 起)NativeQuery改为使用。

2)但它不会解决你的问题,因为你注意到它也被弃用了。从 Hibernate 5.3 迁移指南SQLQuery.addScalar() org.hibernate.query.Query.setResultTransformer()

使用 ResultTransformer 可以定义如何处理查询结果,即,它可以用来改变查询结果的“形状”。

在 Hibernate 6.0 中,ResultTransformer 将被 @FunctionalInterface 替换,因此不推荐使用 org.hibernate.query.Query 中的 setResultTransformer() 方法。

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();
}

推荐阅读