簡體   English   中英

Hibernate Criteria API:獲得n個隨機行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM