HQL返回有序查询结果中对象的索引?

时间:2009-02-09 14:36:24

标签: hibernate hql

我可以使用HQL获取有序查询结果的索引吗?

我知道这样做的唯一方法是从数据库中取回所有结果,然后遍历所有结果。

例如,给定:

<hibernate-mapping>
<class name="Dog" table="DOG">

    <id name="id" type="int" column="DOG_id">
        <meta attribute="scope-set">protected</meta>
        <generator class="native"/>
    </id>

    <property name="age" type="int" />

    <property name="name" type="string" />
</class>    
</hibernate-mapping>

然后是这些类型的查询:

//determine where dog with id 43 is in the current search results for dogs ordered by age
Query dogQuery = sess.createQuery("select d.id from Dog as d order by d.age");
List<Dog> dogList = dogQuery.list();
int idx = dogList.indexOf( 43 );

或者,通过狗列表进行更精确的搜索:

Query dogQuery = sess.createQuery("select d.id from Dog as d where (d.name='fluffy' OR d.age >= 3) order by d.age");
List<Dog> dogList = dogQuery.list();
int idx = dogList.indexOf( 43 );

这里的缺点是我们将每个dog.id加载到内存中。

我需要这样的场景:

  • 在一行上显示特定查询结果(数千个)作为点。线和点每分钟左右更新一次。此可视化提供了搜索查询排名的“实时”更新

5 个答案:

答案 0 :(得分:1)

使用List.indexOf()如果列表特别大,那么将列表设置为“extra-lazy”。

但你为什么需要索引?也许你真的没有(因此你不需要解决这个问题)


修改回答:

你这样做完全错了。您所需要的只是:

从狗d,狗d1中选择计数(*),其中d.age&lt; = d1.age和d1.id =:entityId和d1.id&lt;&gt; d.id


为什么会这样: 此查询查找与所讨论的狗(d1)年龄相同或更小的每只狗,但 d1。 (但实际并没有归还所有这些狗 - 因为我们不关心它们。)

计数告诉你“d1之前”的狗数。因此,您可以告诉d1在完整的狗列表中出现的位置。由于您不需要知道列表中所有狗的位置,因此您无需检索所有狗。

答案 1 :(得分:0)

在java List中,您可以调用indexOf(Object)。

有关API的信息,请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html

答案 2 :(得分:0)

将整个结果列表加载到内存中,然后使用应用程序逻辑过滤所需的是错误与数据库交互的方式。

使用SQL WHERE和HAVING子句从数据库首先获得所需内容

答案 3 :(得分:0)

从这个HQL开始(在这种情况下也是有效的SQL):

select dog.id as dogId from canines dog order by dog.codename asc

可以稍加修改并插入到有效的SQL查询中(仅适用于带有rownum列的Oracle):

select rn from 
( select dogid dogId, rownum rn from canines dog order by dogname asc)
where dogid=206

不幸的是,这不是有效的HQL ......

要使用我的初始HQL查询来获取与该SQL查询相同的信息,我计划:

  • 让hibernate生成我的HQL查询到它将用于制作所有结果列表的SQL(希望不首先运行查询)
  • 使用sessionObj.createSQLQuery将此hibernate生成的SQL插入到新的SQL查询中。这个新查询看起来像上面的工作sql。

这是一个疯狂的解决方案吗?

-

注释

SQL to return the rownum of a specific row? (using Oracle db)

答案 4 :(得分:0)

您应该可以使用Hibernates Criteria对象之类的东西来返回查询的一小部分。

我的猜测是你正试图实施分页。

Criteria criteria=session.createCriteria(Item.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(100);
criteria.setMaxResults(50);
List pageResults=criteria.list();

以上代码取消: http://forum.springframework.org/archive/index.php/t-9658.html

这也适用于始终更新的目录,因为您应该对每个页面请求进行此查询。