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.使用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实现这一点.