Spring boot setResultTransformer和addScalar
我在使用entityManager对象返回查询结果集时遇到问题。 我想返回应该转换为pojo对象的联接查询 因此,经过多次尝试,我发现下面的工作代码Spring boot setResultTransformer和addScalar,spring,hibernate,spring-boot,spring-data-jpa,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.un
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();
}
public List getData(){
Query a=entityManager.createNativeQuery(“在t1.id=t2.id上从test1 t1连接test2 t2中选择t1.data1、t2.data2”);
a、 展开(SQLQuery.class)
.addScalar(“数据1”,LongType.INSTANCE)
.addScalar(“数据2”,DoubleType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(Test.class));
返回a.getResultList();
}
但我收到警告说,setResultTransformer()
和addScalar()
方法已被弃用。任何人都可以输入它的替代代码或提供解决方案。
谢谢。1)不推荐的第一件事是: (从5.2开始)改用
NativeQuery
2) 但它无法解决您的问题,因为正如您所注意到的那样,它们也被弃用了。: 使用ResultTransformer,可以定义 应该处理查询,即可以使用它来更改 查询结果 在Hibernate 6.0中,结果变压器将替换为 @FunctionInterface,因此,setResultTransformer() org.hibernate.query.query中的方法已弃用 Hibernate 5.3中没有结果变压器的替代品, 因此,按照这里的建议,目前它可以按原样使用 因此,您可以将其保留为,并通过添加
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();
}
@SuppressWarnings(“弃用”)
公共列表getData(){
查询a=entityManager.createNativeQuery(
“从test1t1中选择t1.data1,t2.data2>在t1.id=t2.id上加入test2t2”);
a、 展开(NativeQuery.class)
//使用Hibernate 6 for addScalar()删除TODO警告
.addScalar(“数据1”,LongType.INSTANCE)
.addScalar(“数据2”,DoubleType.INSTANCE)
//使用Hibernate 6为setResultTransformer()删除TODO警告
.setResultTransformer(Transformers.aliasToBean(Test.class));
返回a.getResultList();
}
请准确指定警告和不推荐的内容。setResultTransformer和addScalar显示不推荐的@DavidxxThank you david和我将SQLQuery.class更改为org.hibernate.query.NativeQuery.class,正如你所说,我将保持原样,直到hibernate更新到来(@functionInterface)。我添加了@SuppressWarnings({“deprecation”})有那么好吗?这似乎是一件好事。在没有给出任何替代方案的情况下对方法进行deprecation是相当令人惊讶的。但是:)不客气。它也很好。但是不需要数组来指定注释value()
当您定义单个值时,如何将其转换为hibernate存储过程。我尝试过,但无法使用unwrap、scalar和setResultTransformer。hibernate的存储过程没有本机查询类的属性。您能解释它或给出解决方案吗?这是另一个问题。一个问题一个问题地解决,以使其在或者其他用户。因此,您应该为此打开一个新问题。