当前位置: 首页 > 知识库问答 >
问题:

具有嵌套列表实体的实体的Hibenrate+投影和标准

濮阳靖
2023-03-14

我有一个名为Student实体,它有几个与Student相关的字段,还有一个具有一个任何关系的主题列表。在这里,我需要得到所有的字段,包括主题列表,除了“图像”,因为它使用更多的内存,它需要很长的时间来检索所有行。有没有人可以说,如何创建投影和标准,以检索这个学生对象,没有图像字段单独?有没有像“AliastObeAnneStedResultTransformer”这样的自定义结果转换器?因为在我将主题列表作为一个或多个关系的情况下,这将不起作用。

@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());

共有1个答案

窦伟
2023-03-14

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

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

 类似资料:
  • 我需要使用MapStruct将一些实体和实体列表转换为单个DTO。此DTO包括嵌套列表。 假设,我有以下持久性支持的POJO: 以及这些实体的一些集合: DTO如下所示: 和嵌套的DTO: 除SomeLink列表外,我需要从实体映射的所有字段: 我填充的嵌套列表如下: 结果涉及大量手动转换: 有没有办法通过使用MapStruct的功能来完成同样的工作?就像这样:

  • 作为条件表达式的结果,我很难获得相关实体对象的列表。我有两个具有多对多关系的对象 但是,这并不像预期的那样有效,因为投影API似乎只支持投影标量属性,而不支持投影实体对象。是否可以通过投影或其他标准API指定这种类型的选择?

  • 我有一个关于嵌套列表投影界面用法的问题。我有两个实体(父和子)(它们有单向关联) 父级=> 子=> 我有两个选择特定列投影界面。 这个查询可以工作,但是它选择ChildEntity的所有列,并且只将id、name propeties映射到ChildProjection。(生成的查询选择所有列,但我想只选择id和name列) 我如何只选择id和name列(为嵌套列表投影界面选择特定列)并映射到Chi

  • 我在JPA中使用Micronaut数据,并且有两个实体。第一个是< code >配方: 第二个是,它指的是 : 现在我想在API中为DTO提供属性,但不提供整个实体,因为它包含MonyToOne和OneToMany关系,在这种情况下不需要。因此,我为此创建了投影 DTO: 并将< code>listAll()方法添加到< code > parse error repository 中: 但似乎Mi

  • 你们知道如何忽略嵌套的“results”属性并直接获得列表吗?在这种情况下真的需要自定义反序列化器或包装器类吗? 谢了!

  • 我想在Hibernate投影列表中获取嵌套对象值。我有Pojo“费用”和“关税”等级,有一对一和多对一的关系。 我的示例代码如下: 要价 关税 我想按收费模式从关税中提取金额值。 我编写的sql标准在ie中起作用。 选择tariff.amount,charge.name费用,关税charge.name喜欢's%'; 我尝试了以下标准。 我只是检查与restClient它返回空值。如何编写这个sql