我试图从数据库获取数据并将其映射到不同的实体,但我得到
java.lang.IllegalArgumentException: java.lang.ArrayIndexOutOfBoundsException: 0
我的 table 看起来像
@Entity
@Table(name = "Student")
@NamedNativeQueries({
@NamedNativeQuery(name = "findAll", query = "Select a.student_id as id, a.student_code as code from Student a")
})
public class Student {
@Id
private Long student_id;
private String student_code;
private String student_user_id;
private String student_first_name;
//Some other fields, getters and setters
}
我的 BO 看起来像
@Entity
public class Generic{
@Id
private Long id;
private String code;
private String user_id;
//getters and setters
}
我的 DAO 调用类是这样的
Query query = entityManager.createNamedQuery("findAll", Generic.class);
query.getResultList();
我遇到异常
entityManager.createNamedQuery("findAll", Generic.class);
这是我的堆栈跟踪
Caused by: java.lang.IllegalArgumentException: java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.internal.AbstractSharedSessionContract.buildQueryFromName(AbstractSharedSessionContract.java:774)
at org.hibernate.internal.AbstractSharedSessionContract.createNamedQuery(AbstractSharedSessionContract.java:869)
at org.hibernate.internal.AbstractSessionImpl.createNamedQuery(AbstractSessionImpl.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:301)
at com.sun.proxy.$Proxy157.createNamedQuery(Unknown Source)
最佳答案
I am trying to fetch data from db and mapping it to a different entity but I get
ArrayIndexOutOfBoundsException
但是在下面的行中,您没有这样做,您正在尝试获取 Student
的列表实体列表。你这里的不同实体是什么?
entityManager.createNamedQuery("findAll", Student.class);
但是正如您提供的另一个实体 Generic
,我假设您希望将数据加载到其中。对于这个问题有不同的可能的解决方案。让我们弄清楚。
使用选择新关键字
将您的 native 查询更新为此
@NamedNativeQueries({
@NamedNativeQuery(name = "Student.findAll", query = "SELECT NEW Generic(a.student_id, a.student_code) FROM Student a")
})
您必须在 Generic
中定义一个构造函数类以及限定此调用的类
public void Generic(Long id, String code) {
this.id = id;
this.code = code;
}
并将 DAO 中的查询执行更新为
List<Generic> results = em.createNamedQuery("Student.findAll" , Generic.class).getResultList();
注意: 您可能必须放置 Generic
的完全限定路径。查询中的类
从 List<Object[]>
构建
或者,直接且最简单的解决方案将获取结果列表作为 Object[]
的列表。并填充到您想要的任何新对象。
List<Object[]> list = em.createQuery("SELECT s.student_id, s.student_code FROM Student s")
.getResultList();
for (Object[] obj : list){
Generic generic = new Generic();
generic.setId(((BigDecimal)obj[0]).longValue());
generic.setCode((String)obj[1]);
}
关于java - 如何将查询的结果集映射到表以外的不同实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59942606/