spring - 春季启动 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()
方法已被弃用。
任何人都可以输入它的替代代码或提供解决方案。
谢谢。
解决方案
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();
}
推荐阅读
- javascript - JavaScript String.split 与组
- cassandra - Cassandra 数据建模以按日期时间范围检索数据
- vim - 使用来自 iex open 命令的 Elixir 和 Atom 编辑器
- javascript - 是否可以将 p5js 文件导入另一个文件?
- python-3.x - 我在 while 循环中有一个 if 函数,但它要么忽略它,要么不中断
- java - 如何在 JavaFX 中将形状放在背景中?
- java - 使用相同的变量来打印收据,因此每个项目都传递相同的值。
- reactjs - React 日期选择器问题:如何在表格中以正确的格式显示日期?
- python - 我使用 num2words 作为 pico2wave 的输入的 TTS 很差
- java - 在 Java 中动态创建变量的新实例