我可以使用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加载到内存中。
我需要这样的场景:
答案 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查询相同的信息,我计划:
这是一个疯狂的解决方案吗?
-
注释
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
这也适用于始终更新的目录,因为您应该对每个页面请求进行此查询。