小编典典

如何使用Hibernate Projection检索复杂的类及其成员?

hibernate

我有一个如下的类,需要使用Hibernate从数据库中检索。问题是我的班级有多个成员,其中大多数是班级,如何检索他们?

@Entity
public class Student {
  @Id
  long id;
  String name;
  String fname;
  @OneToMany
  List<Course> courses;
  @ManyToOne
  Dealer dealer;
  ...
}

@Entity
public class Dealer {
   @Id
   long id;
   String name; 
   @OneToMany(fetch = FetchType.LAZY, mappedBy = "cr.dealer", cascade = CascadeType.ALL)
   Set<Car> cars = new HashSet<Cars>(0);
   ..

}

我需要检索学生ID 1及其所有课程,经销商和经销商的汽车清单。

我的预测如下,但不返回任何内容。

  ...
    .setProjection(Projections.projectionList()

    .add(Projections.property("friends.cars").as("cars")
    ...

阅读 308

收藏
2020-06-20

共1个答案

小编典典

因为您具有课程列表和一组汽车,所以您只需在一个查询中获取整个图形即可:

select s
from Student s
left join fetch s.courses
left join fetch s.dealer d
left join fetch d.cars
where s.id = :id

因为您要获取两个集合,所以此查询将生成笛卡尔乘积,因此您需要确保所选的子集合没有太多条目。

如果您不想运行笛卡尔积,则只需运行以下查询:

select s
from Student s
left join fetch s.courses
left join fetch s.dealer d
where s.id = :id

然后您访问Dealer.cars并通过单独的查询获取该集合:

Student s = ...;
s.getDealer().getCars().size();
2020-06-20