【问题标题】:Spring boot setResultTransformer and addScalar春季启动 setResultTransformer 和 addScalar
【发布时间】:2019-06-01 07:33:11
【问题描述】:

我在使用 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() 方法已被弃用。
任何人都可以输入它的替代代码或提供解决方案。
谢谢。

【问题讨论】:

  • 请准确说明警告和不推荐使用的内容。
  • setResultTransformer 和 addScalar 显示已弃用 @davidxxx

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


【解决方案1】:

1) 弃用的第一件事是SQLQuery

(从 5.2 开始)改用 NativeQuery

2) 但它不会解决您的问题,因为您注意到 SQLQuery.addScalar() org.hibernate.query.Query.setResultTransformer() 也已被弃用。
From the Hibernate 5.3 migration guide

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

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

【讨论】:

  • 谢谢大卫,我将 SQLQuery.class 更改为 org.hibernate.query.NativeQuery.class,正如你所说,我会保持原样,直到休眠更新到来(@FunctionalInterface)。
  • 我添加了@SuppressWarnings({"deprecation"}) 可以吗?
  • 这似乎是件好事。在不提供任何替代方案的情况下弃用一种方法相当令人惊讶。但是很好:)不客气。这也很好。但是当你定义单个值时,不需要数组指定注解value()
  • 如何将其转换为休眠存储过程。我试过了,但我不能使用 unwrap、scalar 和 setResultTransformer。 hibernate 的存储过程没有原生查询类的属性。你能解释一下或给出解决方案吗?
  • 这是另一个问题。一个问题一个问题,使其可被其他用户重复使用。所以你应该为此提出一个新问题。
猜你喜欢
  • 2017-10-06
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2015-04-18
  • 2017-06-24
  • 2015-08-22
  • 2015-09-18
相关资源
最近更新 更多