java - 如何将查询的结果集映射到表以外的不同实体

标签 java hibernate jpa spring-data-jpa

我试图从数据库获取数据并将其映射到不同的实体,但我得到

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/

相关文章:

java - 字符串替换问题

java - 如何为两个或更多用户共享一个页面?

java - java中检测浏览器语言

java - 使用 Hibernate/JPA 实现 Java Server Faces 中的数据持久性

java - 如何在 JPA 中删除具有多对多关系的实体(以及相应的连接表行)?

java - 使用 Hibernate 更新查询性能

java - InputStream/OutputStream read()/write()函数相关性及用法

java - 如何将存储过程的返回值映射到 Hibernate 中的实体类

java - 删除时执行 JPA 管理实体的清理方法

java - 如何使用 EJBQL 选择实体集合并将其作为参数传递给 Bean?