[英]Hibernate Criteria API: get n random rows
我無法弄清楚如何從條件實例中獲取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 ),並且在當前狀態下,您必須繼承Order
類以實現此功能。 這是可行的,參考Jira問題,但不是開箱即用的。
所以,如果真的需要這個查詢,我的建議是使用HQL。 請記住,它不會是便攜式的。
1其他讀者可能希望檢查post SQL以從數據庫表中選擇一個隨機行,以了解如何使用MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle實現這一點。
Criteria API不提供此功能。 但是,在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映射器,而不是一個奇跡機器,它只能執行底層數據庫支持的功能。
如果您已知一個已知的提升數字並知道開始和結束,您可以在計算機上生成一個隨機數並要求該行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.