在实体 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();
}
注:
- 确保使用完全限定名称调用 Student 构造函数。
- 不要将 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。
在这种情况下,而不是在对象上执行完整的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();
}
注:
- 确保使用完全限定名称调用 Student 构造函数。
- 不要将 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。