我有一个实体调用学生,其中几个与学生相关的字段和一个具有oneToMany关系的主题列表。这里我需要获取所有字段,包括除了“图像”之外的主题列表,因为它使用更多内存,它需要很长时间来检索所有行。有人可以说如何创建Projection和条件来检索这个没有图像字段的Student对象吗?是否有任何自定义结果转换器,如“AliasToBeanNestedResultTransformer”?因为这对我的场景不起作用,我将主题列表作为OneToMany关系。
@Entity
@Table(name="STUDENT")
public class Student {
@id
private long studentId;
private String name;
private String dob;
private int age;
@Lob
private byte[] image;
@Lob
private byte[] imageTnail;
@OneToMany(mappedBy="subject", cascade = CascadeType.ALL, orphanRemoval=true)
private List<Subject> subjects;
//setter & getter...
}
@Entity
@Table(name="SUBJECT")
public class Subject {
@id
private long subjectId;
private String subjectName;
@ManyToOne
@JoinColumn(name="studentId")
private Student student;
}
修改
List<Student> results = getSession().createCriteria(Student.class)
.setProjection( Projections.projectionList()
.add( Property.forName("studentId"))
.add( Property.forName("name") )
.add( Property.forName("dob"))
.add( Property.forName("age"))
).setResultTransformer(Transformers.aliasToBean(Student.class)).list();
System.out.println("StudentDaoImpl.getStudents()"+results.get(0).getName());
答案 0 :(得分:1)
试试这个解决方案:
List<T> results = session.createCriteria(Student.class)
.setProjection( Projections.projectionList()
.add( Property.forName("studentId"),"studentId" )
.add( Property.forName("name"),"name" )
.add( Property.forName("dob"),"dob" )
.add( Property.forName("age"),"age" )
).add( Restrictions.eq("studentId", @idAsParam ) )
.setResultTransformer(Transformers.aliasToBean(Student.class);
.list();
答案 1 :(得分:0)
首先,mappedBy
属性必须包含外键的名称,因此您必须进行此更正:
@OneToMany(mappedBy="student", cascade = CascadeType.ALL, orphanRemoval=true)
private List<Subject> subjects;
其次,是的,您可以在不获取图像的情况下检索学生列表:
List<T> results = session.createCriteria(Student.class)
.setProjection( Projections.projectionList()
.add( Property.forName("studentId") )
.add( Property.forName("name") )
.add( Property.forName("dob") )
.add( Property.forName("age") )
)
.setResultTransformer(Transformers.aliasToBean(Student.class);
.list();
如果您希望获得特定学生
List<T> results = session.createCriteria(Student.class)
.setProjection( Projections.projectionList()
.add( Property.forName("studentId") )
.add( Property.forName("name") )
.add( Property.forName("dob") )
.add( Property.forName("age") )
).add( Restrictions.eq("studentId", @idAsParam ) )
.setResultTransformer(Transformers.aliasToBean(Student.class);
.list();
第一个对象将保留对象。