0

我可以使用 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 加载到内存中。

我需要这个的场景:

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

5 回答 5

1

使用 List.indexOf() 如果列表特别大,则使列表“特别懒惰”。

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


修改后的答案:

你做的完全错了。所有你需要的是 :

从狗 d、狗 d1 中选择计数(*),其中 d.age <= d1.age 和 d1.id = :entityId 和 d1.id <> d.id


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

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

于 2009-02-13T06:46:56.120 回答
0

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

参见API列表

于 2009-02-09T14:42:53.837 回答
0

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

首先使用 SQL WHERE 和 HAVING 子句从数据库中获取您需要的内容。

于 2009-02-10T21:51:53.167 回答
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 查询相同的信息,我计划:

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

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

--

笔记

SQL返回特定行的rownum?(使用 Oracle 数据库)

于 2009-02-10T23:50:51.990 回答
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

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

于 2009-02-13T17:55:06.000 回答