如何使用 Hibernate Criteria API 通过多对多关系对实体进行排序?

How to order entities by many-to-many relationship using the Hibernate Criteria API?

提问人:betta7391 提问时间:7/21/2021 最后编辑:betta7391 更新时间:7/26/2021 访问量:182

问:

我需要通过多对多关系对我的实体进行排序。

假设我的域如下:

@Entity
public class Field {
  ....

  @ManyToMany
  @JoinTable(name="field_crop", joinColumns={@JoinColumn(name="field_id")}, inverseJoinColumns = {@JoinColumn(name="crop_id")})
  @OrderBy(value="name")
  private List<Crop> crops;

  ....

}

@Entity
public class Crop {
  ....

  private String name;

  ....

}

假设在我的域中,我有以下数据:

  • Filed1 { crops: {柠檬} }
  • Filed2 { crops: {猕猴桃, 杏子} }
  • Filed3 { crops: {杏} }
  • Filed4 { crops: {鳄梨, 香蕉} }

使用关系上的注释,我将列表中的元素按其名称排序:@OrberBy@ManyToManyCrop

  • Filed1 { crops: {柠檬} }
  • Filed2 { crops: {杏子、猕猴桃} }
  • Filed3 { crops: {杏} }
  • Filed4 { crops: {鳄梨, 香蕉} }

提取所有 Field 实体(按 Crop 实体的 name 属性排序)的预期结果为:

  • Filed3
  • Field2
  • Field4
  • Field1

如何通过 Hibernate Criteria 做到这一点?

Java 休眠 JPA

评论


答:

0赞 Christian Beikov 7/26/2021 #1

最好在实体类中的事件侦听器中编写一个列表并对其进行排序。Comparator@PostLoad

评论

0赞 betta7391 7/29/2021
好的,我可以在内存中执行此操作;但是如果我使用分页呢?
0赞 Christian Beikov 7/29/2021
好吧,您不是在对集合进行分页,而是对整体结果进行分页,所以这无关紧要。无论哪种方式,获取集合并对整体结果进行分页都不是那么好用,因为 Hibernate 必须获取整个结果集并执行内存分页。如果你想要高效的分页,我建议你看看 Blaze-Persistence,它可以有效地处理这个问题:persistence.blazebit.com/documentation/1.6/core/manual/en_US/......