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