【问题标题】:Hibenrate + Projection and Criteria for Entity with nested List Entity具有嵌套列表实体的实体的休眠 + 投影和标准
【发布时间】:2016-11-07 01:52:41
【问题描述】:

我有一个名为 Student 的实体,其中与学生相关的字段很少,并且有一个具有 oneToMany 关系的主题列表。在这里,我需要获取所有字段,包括“图像”以外的主题列表,因为它使用更多内存,需要很长时间才能检索所有行。有人可以说如何创建投影和标准以仅在没有图像字段的情况下检索此学生对象吗?是否有像“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());

【问题讨论】:

    标签: hibernate dao projection hibernate-criteria


    【解决方案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();
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 此外,乍一看,它似乎是另一个答案的复制粘贴(我现在看到了不同之处)。也许有必要注意一下为什么其他答案对您不起作用,以及您为什么要进行所做的更改。
    【解决方案2】:

    首先,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();
    

    第一个对象将持有该对象。

    【讨论】:

    • 这可行,但我将主题设为空。我应该得到与每个学生相关的所有科目。
    • 所以你必须将它添加到你的投影中:.add( Property.forName("subjects") )
    • 添加了上面有问题的代码。我看到学生对象返回,但所有字段都具有空值。那是我缺少的东西吗?
    猜你喜欢
    • 2011-11-27
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2011-04-11
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多