在实体 Class 的多个字段上使用 HQL select 语句将 java.lang.object 转换为自定义对象的最佳方法

Best way to cast java.lang.object to customized object on using HQL select statement on multiple fields on an Entity Class

在这种情况下,而不是在对象上执行完整的select,而是决定只在必填字段上执行select语句。因此生成的查询会更少。

一旦结果出现,我想转换回原始值并将它们 return 调用方法。

请提出任何替代有效方法。

      public class Student {
            @Id
            @GeneratedValue(strategy=GenerationType.AUTO)
            private Integer id;

            @Column(name="enroll_id")
            private String enrollmentId;

            public Student(Integer id, String enrollmentId) {
             super();
             this.id = id;
             this.enrollmentId = enrollmentId;
             }
               // source code continues
            }

     public List<Student> getStudentList(){

        Query multipleSelect=em.createQuery("select student.id,student.enrollmentId from Student as student");

        List<Object[]> studentList=multipleSelect.getResultList();

        List<Student> studentArrayList=new ArrayList<Student>();

        for(Object[] list:studentList){
            Integer id=((Integer)list[0]);
            String eId=((String)list[1]);
            studentArrayList.add(new Student(id, eId));
        }

        return studentArrayList;
    }

如果您正在寻求一种方法来避免从 resultList 中强制转换每一行并且必须手动创建 Student 对象,请尝试使用“JPQL Constructor Expressions

您select查询可以修改为:

"select NEW com.FullyQualifiedName.Student(student.id,student.enrollmentId) from Student as student"

并直接接受查询结果为

 List<Student> studentList=multipleSelect.getResultList();

或简单地:

public List<Student> getStudentList(){
    return em.createQuery("select NEW com.FullyQualifiedName.Student(student.id,student.enrollmentId) from Student as student").getResultList();
}

注:

  1. 确保使用完全限定名称调用 Student 构造函数。
  2. 不要将 JPQL 与 createNativeQuery 一起使用。

如果您希望查询的输出为 Student 类型,则必须以不同的方式创建查询,即

TypedQuery<Student> multipleSelect=em.createQuery("select NEW your_package.Student(student.id,student.enrollmentId) from Student as student"
                                                 , Student.class);

List<Student> students = multipleSelect.getResultList();

但是,这不是执行此操作的好方法,因为该方法的 return 类型表明它是 return 一个完全填充的 Student 对象。此外,您还必须为每个组合创建构造函数。我宁愿建议你拿一张地图,即

TypedQuery<Map> multipleSelect=em.createQuery("select NEW map(student.id as id,student.enrollmentId as eid) from Student as student"
                                              , Map.class);
List<Map> students = multipleSelect.getResultList();

这将 return 给你一个地图,键为 "id",值为学生的实际 ID。