【问题标题】:HQL keep order of subqueryHQL保持子查询的顺序
【发布时间】:2015-02-08 13:37:26
【问题描述】:

我们目前在显示带有子查询的有序对象时遇到问题。

我们有一个表格,我们在其中保存与它们的排名相对应的对象的顺序。现在,如果有人想亲自查看实际对象,我们进行以下查询(查询简化并更改名称):

from Object as object where object.id = some ( select objectid from RankingObject where type = :object_type ))

由于我们不想在每次请求此类查询时对所有对象进行排名,因此我们定期执行排名(以及 RankingObjects 的创建),然后仅查找与 RankingObjects 对应的对象,这些对象根据排名算法(排名最高的对象是表中的第一个)。

子查询以正确的顺序返回对象,就像它们保存在数据库中一样。外部查询返回正确的对象,但它们的顺序与内部查询不对应,而是与数据库中出现的顺序相对应(最旧的对象首先出现)。

我的问题:我们如何在外部查询上强制执行内部查询的顺序?当然,对每个子查询项执行一次查询在性能方面是没有选择的。

【问题讨论】:

    标签: hibernate subquery hql


    【解决方案1】:

    您必须使用 orderby 子句。如果没有 orderby,则无法保证从数据库中获取数据的顺序。这仅取决于查询计划器的用途。

    如果 RankingObject 有对 Object 的引用,您可以执行 select object from RankingObject where type = :object_type orderby rank 之类的操作。

    https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-ordering

    【讨论】:

    • 我们尝试使用 order by,但问题是我无法在特定值之后对它们进行排序,因为该对象没有特定于排名的值,并且 rankobject 仅包含 id对象,而不是对象本身(防止数据重复和不连贯的数据)。但是,一种想法是将对象与rankingObject 连接起来,即我们只将rankingObject 的id 添加到对象中,并在该id 之后进行排序;真的没有更简单的方法来保持内部查询的顺序吗?
    • 不,没有。请记住,订单无法保证。您的数据库碰巧就是这样做的。除其他外,请参阅:stackoverflow.com/questions/10064532/…。所以你需要一个订单。你做什么并不重要。
    • 顺便说一句。我不是在谈论将对象存储在排名对象中。只保留一个引用(在数据库中最终作为rankingobject 表中对象的id)。如果您在 RankingObject 中引用了排名对象并且 RankingObject 是一个休眠实体,那么您可以执行select object from RankingObject where type = :object_type orderby idid 是一个特殊的休眠属性,它将始终引用标识符。
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多