HQL保留子查询的顺序

问题描述:

我们目前在使用子查询显示有序对象时遇到问题。HQL保留子查询的顺序

我们有一张表格,用于保存与其排名对应的对象的顺序。现在,如果有人想看到实际的对象本身,我们提出以下查询(查询简化和名称变更):

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

因为我们不想排名每次请求此类查询的所有对象,我们周期性地执行排序(以及创建排序对象),然后只找到排序对象对应的对象,排序对象根据排序算法排序(排名最高的对象是表中的第一个排序对象)。

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

我的问题:我们如何执行内部查询的顺序?当然,为每个子查询项目执行一个查询在性能方面是无法选择的。

您必须使用orderby子句。如果没有订单,则不能保证数据从数据库中获取的顺序。这只取决于查询规划器对它的作用。

如果RankingObject具有对象的引用,那么可以执行类似于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

+0

我们试图用为了通过这样做,但问题是,我不能一个特定的值之后命令他们,因为对象可是没有一个特定的等级值,rankobject只包含的ID对象,而不是对象本身(防止数据重复和非连贯数据)。然而,一个想法是将该对象与rankingObject连接起来,因此我们只将这个rankingObject的id添加到该对象的顺序和顺序之后;有没有更简单的方法来保持内部查询的顺序? – abiri 2015-02-10 16:42:16

+0

不,没有。请记住,订单不能保证。你的数据库恰好是这样做的。请参阅其他人:http://*.com/questions/10064532/the-order-of-a-sql-select-statement-without-order-by-clause。所以你需要一个订单。你做什么并不重要。 – mpkorstanje 2015-02-10 19:27:21

+0

Btw。我并不是在将对象存储在排名对象中。只需保留一个引用(在数据库中,最终成为排名对象表中对象的ID)。 如果您有对RankingObject中排名对象的引用,并且RankingObject是一个hibernate实体,那么您可以从'Ranking对象中选择对象,其中type =:object_type orderby id'。 'id'是一个特殊的hibernate属性,它将始终引用标识符。 – mpkorstanje 2015-02-10 19:29:43