Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot setResultTransformer和addScalar_Spring_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Spring boot setResultTransformer和addScalar

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

我在使用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();    
}
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的存储过程没有本机查询类的属性。您能解释它或给出解决方案吗?这是另一个问题。一个问题一个问题地解决,以使其在或者其他用户。因此,您应该为此打开一个新问题。