Hibernate Criteria API:获得n个随机行

问题描述 投票:18回答:4

我无法弄清楚如何从条件实例中获取n个随机行:

Criteria criteria = session.createCriteria(Table.class);
criteria.add(Restrictions.eq('fieldVariable', anyValue));
...

那又怎样?我找不到任何带有Criteria API的文档

这是否意味着我应该使用HQL?

感谢名单!

编辑:我得到的行数:

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult();

如何获取索引在0到最大值之间的n个随机行?再次!

java sql hibernate mysql random
4个回答
45
投票

实际上,有可能使用Criteria和一些调整。方法如下:

Criteria criteria = session.createCriteria(Table.class);
criteria.add(Restrictions.eq("fieldVariable", anyValue));
criteria.add(Restrictions.sqlRestriction("1=1 order by rand()"));
criteria.setMaxResults(5);
return criteria.list();

任何Restrictions.sqlRestriction都会添加关键字'和';为了使其效果无效,我们将添加一个虚拟条件并注入我们的rand()函数。


6
投票

首先,请注意在SQL中没有标准的方法,每个数据库引擎都使用自己的专有语法1。使用MySQL,获取5个随机行的SQL语句将是:

SELECT column FROM table
ORDER BY RAND()
LIMIT 5

您可以在HQL中编写此查询,因为HQL中的order by子句会传递到数据库,因此您可以使用任何函数。

String query = "SELECT e.attribute FROM MyEntity e ORDER BY RAND()";
Query q = em.createQuery(query);
q.setMaxResults(5);

但是,与HQL不同,Criteria API目前不支持ORDER BY Native SQL(请参阅HHH-2381),在当前状态下,您必须继承Order类以实现此功能。这是可行的,参考Jira问题,但不是开箱即用的。

所以,如果真的需要这个查询,我的建议是使用HQL。请记住,它不会是便携式的。

1其他读者可能想查看帖子SQL to Select a random row from a database table,看看如何使用MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle实现这一点。


1
投票

Criteria API不提供此功能。但是在MySQL中,你可以使用ORDER BY RAND() LIMIT n,其中n表示你想要获取的随机行数。

SELECT col1, col2, col3 FROM tbl ORDER BY RAND() LIMIT :n

您确实需要将其作为HQL执行。


0
投票

抱歉,你无法有效地获取随机行。 Hibernate只能做SQL所做的事情,而随机行提取根本就不是我所知道的任何标准SQL实现的一部分 - 实际上,据我所知,这不是我所知道的任何SQL的一部分(任何人都欢迎我)。

由于Hibernate是一个O / R映射器,而不是一个奇迹机器,它只能执行底层数据库支持的功能。

如果您已知一个已知的提升数字并知道开始和结束,您可以在计算机上生成一个随机数并要求该行。

© www.soinside.com 2019 - 2024. All rights reserved.