【问题标题】:Hibernate OneToMany OrderBy messes up main queryHibernate OneToMany OrderBy 搞乱了主查询
【发布时间】:2012-12-22 09:09:40
【问题描述】:

我在 Hibernate 中有一个要查询的类视频,我按 Order.desc("id") 对结果进行排序。 查询按预期工作。但是,如果我在 Video 中添加 @OneToMany 注释以包含 cmets,我还会在同一注释中添加 @OrderBy(我需要 cmets 为 ordered by "createdTime")。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "videoId", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("commentTime")
public List<Comment> getComments()

这破坏了主查询 - 现在返回视频是错误的:它命令 SQL 首先返回没有 cmets 的视频,然后是 1 条评论,等等:

order by comments6_.commentTime asc, this_.videoId desc

我只需要按 id 对视频进行排序。

【问题讨论】:

  • 也许值得使用 Hibernate 的@Sort,而不是在检索数据后在内存中执行排序?不过,您需要为此提供Comparator。至少这样你就知道它不会影响你的 SQL。

标签: hibernate one-to-many hibernate-annotations hibernate-onetomany


【解决方案1】:

尝试改用@Sort

@OneToMany(fetch = FetchType.LAZY, mappedBy = "videoId", cascade = CascadeType.ALL, orphanRemoval = true)
@Sort(type = SortType.COMPARATOR, comparator = CommentTimeComparator.class)
public List<Comment> getComments()

这样您就知道它不会影响您的 SQL。它还可以通过减轻数据库压力来提高性能 - 例如,如果您在要排序的同一实体上有多个 @OneToMany 关联。

【讨论】:

  • 你成就了我的一天!非常感谢。
  • Sort 已弃用,应使用 SortComparator
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多