Hibernate Criteria API:获得n个随机行

我无法弄清楚如何从条件实例中获取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个随机行? 再次!

实际上,有可能使用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()函数。

首先,请注意在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 ),并且在当前状态下,您必须inheritanceOrder类以实现此function。 这是可行的,参考Jira问题,但不是开箱即用的。

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

1其他读者可能希望检查post SQL以从数据库表中选择一个随机行,以了解如何使用MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle实现这一点。

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

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

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

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

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

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