Spring boot 在Spring DataJpa@Query方法中,如何将Object[]作为返回类型?

Spring boot 在Spring DataJpa@Query方法中,如何将Object[]作为返回类型?,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我想在Repo接口的@Query方法中,以Object[]作为返回类型,只取一行。但是在访问它显示的值时 java.lang.ArrayIndexOutOfBoundsException:1 如果我在@Query方法中将Object(而不是Object[])作为返回类型,并且在再次调用它时,我必须将返回类型转换为Object[],以获取值。但我不明白为什么不能直接将Object[]作为返回类型 回购接口 我应该得到name(String)和sal(Double)值作为结果 @Query("sel

我想在Repo接口的@Query方法中,以Object[]作为返回类型,只取一行。但是在访问它显示的值时 java.lang.ArrayIndexOutOfBoundsException:1

如果我在@Query方法中将Object(而不是Object[])作为返回类型,并且在再次调用它时,我必须将返回类型转换为Object[],以获取值。但我不明白为什么不能直接将Object[]作为返回类型

回购接口 我应该得到name(String)和sal(Double)值作为结果

@Query("select e.empName,e.empSal from org.st.model.Employee e where e.empId= ?1 ") 
Object getData2(Integer eid); 

 Object[] obj = (Object[]) repo.getData2(106);  
System.out.println(obj[1]); 

很好用。因为我已将对象作为返回类型。但是我不明白为什么返回类型显示为AIOBE的对象[]。

Java数组索引以0开头。如果对象[]obj的长度为1,则需要按如下方式检索它:obj[0]

试试这个:

public void run(String...strings) throws Exception{
     Object[] obj = repo.getData2(106);
             System.out.println(obj[]);
     System.out.println(obj[0]);
  }
}
ArrayIndexOutOfBoundsException表示您正在尝试 访问不存在的数组索引

Employee类必须有getter

但是使用
列表
可以确保类型安全

public interface EmployeeRepository extends JpaRepository<Employee, Integer>{
    @Query("select e.empName,e.empSal from Employee e where e.empId= ?1")
 List<Employee> getData2(Integer eid);
}
public接口EmployeeRepository扩展了JpaRepository{
@查询(“从Employee e中选择e.empName,e.empSal,其中e.empId=?1”)
列表getData2(整数eid);
}
您可以轻松访问

List<Employee> results = repo.getData2(106);
for(Employee emp : results){    
   System.out.println(emp.getName() + " " + emp.getSal());
 }
List results=repo.getData2(106);
对于(员工emp:结果){
System.out.println(emp.getName()+“”+emp.getSal());
}

返回
对象[]
意味着查询返回一个记录数组。每个记录本身就是一个
对象[]
。因此,访问需要使用的第一条记录的第一列
(Object[])o[0])

您可能想改用:




为什么不直接获取employee
可选的findById(整数empId)和在runner类中
可选emp=repo.findById(106);System.out.println(emp.isPresent()?“no employee”:emp.get().getSal())是,但我想知道为什么对象[]在对象返回类型工作时不工作。他的查询显示
@query(“从org.st.model.Employee e中选择e.empName,e.empSal,其中e.empId=?1”)
。所以他的数组大小必须是2,对吗?所以obj[1]必须是有效的?
@Query(“从org.st.model.Employee e中选择e.empName,e.empSal,其中e.empId=?1”)
对象getData2(整数eid)
Object[]obj=(Object[])repo.getData2(106)
System.out.println(obj[1])工作正常。因为我已将对象作为返回类型。但我不明白为什么返回类型为Object[]的对象显示为AIOBE。这是不正确的。此查询返回一个元素的简单对象数组,其中元素是Employee。尝试运行这个System.out.println(obj[0].getClass()),您将看到。是的,但是@Query方法中的Object RT在调用时强制转换到Object[]后工作。唯一的问题是为什么Directive Object[]返回类型不起作用。我相信您误解了Spring数据JPA存储库应该如何工作。您有两个选项:或者使用可选的findById(整数ID)按ID查询;方法,或者,如果您真的只需要指定的这个投影,请使用视图创建一个自定义投影:我只想获取一些属性而不是Employee类的所有属性是的,您可以这样获取。没有问题,但当对象RT在强制转换后工作时,RT对象[]有什么问题。这不是问题,但这是一个很好的类型安全实践。如果您认为此答案有帮助,请向上投票并勾选,以帮助寻求此类问题的人显示null和null。我认为@Query方法中的投影不起作用。在jpa查询中添加列别名以匹配投影接口中的getter。是的,那么在这种情况下我也会得到null。
Object[] results = repo.getData2(106);
for(Employee emp : results){    
   System.out.println(emp.getName() + " " + emp.getSal());
 }
public interface EmployeeRepository extends JpaRepository<Employee, Integer>{
    @Query("select e.empName,e.empSal from Employee e where e.empId= ?1")
 List<Employee> getData2(Integer eid);
}
List<Employee> results = repo.getData2(106);
for(Employee emp : results){    
   System.out.println(emp.getName() + " " + emp.getSal());
 }
interface EmployeeView {
    String getEmpName();

    String getEmpSal();
}
@Query("select e.empName as empName, e.empSal as empSal from org.st.model.Employee e where e.empId= ?1")
EmployeeView getData2(Integer eid);
EmployeeView emp = repo.getData2(106);