Spring Boot的setResultTransformer和addScalar

3

我在使用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()方法已经过时。
请问有人可以提供它们的替代代码或者解决方案吗?
谢谢。


请明确指出警告信息以及哪些内容已被弃用。 - davidxxx
setResultTransformer和addScalar方法已被标记为过时的。@davidxxx - Sandy
1个回答

2

1) 首先被弃用的是 SQLQuery :

(自 5.2 版本以后) 使用 NativeQuery 替代。

2) 但这并不能解决你的问题,因为你已经注意到 SQLQuery.addScalar()org.hibernate.query.Query.setResultTransformer() 也已经被弃用。
从 Hibernate 5.3 迁移指南中可以看到

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

1
谢谢David,我已经将SQLQuery.class更改为org.hibernate.query.NativeQuery.class,正如你所说的那样,我会保持它不变,直到Hibernate更新它(@FunctionalInterface)。 - Sandy
我添加了 @SuppressWarnings({"deprecation"}),这样可以吗? - Sandy
1
这似乎是一件好事。没有提供任何替代方法就废弃一个方法,这相当令人惊讶。但是没关系 :) 不客气。这也很好。但是,当您定义单个值时,不需要指定注释“value()”来指定数组。 - davidxxx
如何将其转换为Hibernate存储过程?我尝试使用unwrap、scalar和setResultTransformer,但无法成功。Hibernate的存储过程没有本地查询类的属性。你可以解释一下或者提供解决方案吗? - Sandy
这是另一个问题。为了使其可重用于其他用户,每个问题都应该单独提出,并开辟一个新的提问。 - davidxxx
是的,你说得对!我创建了一个新问题,请看一下。https://stackoverflow.com/questions/54278326/how-to-use-hibernate-stored-procedure-with-setresulttransformer-and-scalar - Sandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接