嵌套集合的预测

时间:2017-07-31 09:36:35

标签: java hibernate jpa orm

我有三个实体主题,主题和类别。如何在检索包含主题和主题的所有类别时,为每个实体预取id和name列?我不需要其他字段,因为它会影响性能。

@Entity
class Topic{
  private Long id;
  private String name;
  ...
  //other fields
} 

@Entity
class Subject{
  private Long id;
  private String name;
  ...
 //other fields

  @OneToMany(fetch=FetchType.LAZY)
  private List<Topic> topics;
}

@Entity
class Category{
  private Long id;
  private String name;
  ...
  //other fields
  @OneToMany(fetch=FetchType.LAZY)
  private List<Subject> subjects;
}

1 个答案:

答案 0 :(得分:0)

我建议在投影本身之上创建一个结果类,因为它可以简化结果集处理。 ResultClass需要有一个带有相关查询结果字段的构造函数,您必须在查询本身中使用完全限定名称。

select new org.mypkg.ResultClass(c.id, c.name, s.id, s.name, t.id, t.name)
from Category c
  inner join c.subjects s
  inner join s.topics

然后你只需:

List<ResultClass> results = em.createQuery(query).list();