【问题标题】:How to order entities by many-to-many relationship using the Hibernate Criteria API?如何使用 Hibernate Criteria API 通过多对多关系对实体进行排序?
【发布时间】:2021-07-21 15:51:14
【问题描述】:

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

假设我的域如下:

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

  ....

}

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

  • 归档1 { 作物:{柠檬} }
  • 归档2 { 作物:{猕猴桃,杏子} }
  • 归档3 { 作物:{杏子} }
  • 归档4 { 作物:{鳄梨、香蕉} }

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

  • 归档1 { 作物:{柠檬} }
  • 归档2 { 作物:{杏,猕猴桃} }
  • 归档3 { 作物:{杏子} }
  • 归档4 { 作物:{鳄梨、香蕉} }

获取所有Field实体的预期结果,按Crop实体的name属性排序,是:

  • Filed3
  • Field2
  • Field4
  • Field1

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

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

    【讨论】:

    • 好的,我可以在内存中执行此操作;但是如果我使用分页呢?
    • 好吧,你不是对集合进行分页,而是对整体结果进行分页,所以这并不重要。无论哪种方式,获取一个集合并对整个结果进行分页都不能很好地工作,因为 Hibernate 必须获取整个结果集并进行内存分页。如果你想要高效的分页,我建议你看看 Blaze-Persistence 可以有效地处理这个问题:persistence.blazebit.com/documentation/1.6/core/manual/en_US/…
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2010-09-20
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2013-07-27
    • 2018-10-11
    相关资源
    最近更新 更多