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