具有嵌套列表实体的实体的Hibenrate + Projection和Criteria

时间:2016-11-07 01:52:42

标签: hibernate dao projection hibernate-criteria

我有一个实体调用学生,其中几个与学生相关的字段和一个具有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());

2 个答案:

答案 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();

第一个对象将保留对象。