Hibernate Criteria API:获得n个随机行

Had*_*ien 18 java mysql sql random hibernate

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

Criteria criteria = session.createCriteria(Table.class);
criteria.add(Restrictions.eq('fieldVariable', anyValue));
...
Run Code Online (Sandbox Code Playgroud)

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

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

感谢名单!

编辑:我得到的行数:

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult();
Run Code Online (Sandbox Code Playgroud)

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

小智 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();
Run Code Online (Sandbox Code Playgroud)

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

  • 在sql限制中1 = 1的目的是什么?我得到了正确的输出,没有这个我得到一个错误 (2认同)

Pas*_*ent 6

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

SELECT column FROM table
ORDER BY RAND()
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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