当前位置: 首页 > 面试题库 >

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

澹台季萌
2023-03-14
问题内容

我有一个如下的类,需要使用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")
    ...

问题答案:

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

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


 类似资料:
  • 问题内容: 使用以下代码,我可以成功检索用户的地址字段,为此,我需要使用Projection定义其所有字段。想象地址有100个字段,在这种情况下,我必须定义所有字段。 我想知道是否可以仅返回客户的地址对象而不在Proposition中定义其所有字段吗? 我知道我可以检索地址的ID并使用它来检索其对象,但是我想知道是否还有其他方法而不是此方法或定义其所有字段。 hibernate 我也使用了以下内容

  • 问题内容: 我有一个接收对象并根据其检测到的对象类型执行某些操作的方法: 如何降低环复杂性?我四处搜寻,但找不到任何有用的资讯。 问题答案: 您不能为此使用面向对象的方法吗?创建具有该方法的接口,然后创建实现所需行为的子类?然后调用将执行适当的行为?

  • 问题内容: 这个问题是我先前的问题的后续。我需要检索复杂类的列表。 我需要找到一个特定组的学生列表,这些学生位于特定的位置,其电话号码位于其地址中。我还需要显示每个学生到特定坐标的距离。 下面的代码工作正常,唯一的问题是我无法检索对象列表,例如电子邮件列表,组列表和每个学生的电话列表。 问题答案: hibernate的默认类不会传输嵌套对象,如果您遇到性能问题,应尝试以下代码。 看看这个链接和这一

  • 我正试图从一个站点获取一个数字(比特币的价值),使用下面的代码 它应该打印一个数字,但它没有打印。我尝试使用其他模块,如.gettext,但结果总是没有。我可以用什么来获得我想要的值?

  • 我试图利用Querydsl从表中获取一些结果。到目前为止,这是我尝试过的-- 如何在上面的中合并以便只获取第一个结果?

  • 我是JPA/JPQL的新手,所以如果这个问题不是很清楚,请原谅。 我正在使用以下JPQL查询: 查询在无状态会话上运行,以便获得DB中当前数据的事实上的快照,该快照与实体管理器分离(因此使用了left join fetch)。 不幸的是,我遇到了两个问题: 在尝试微调性能时,使用本机查询似乎并没有比使用JPQL查询更好的性能。使用本机查询也会产生对象类型的结果,这需要后期处理。