2014-01-29 216 views
3

這是我的JPA實體JPA:選擇隨機行

@Entity 
@NamedQueries({ 
     @NamedQuery(name = "Question.randQuestion", query = "SELECT q FROM Question AS q ORDER BY  RANDOM") 
}) 
@Table(name = "questions") 
public class Question implements Serializable { 
..... 
} 

的問題是:

日食給我一個錯誤此namedQuery。它說: 「標識變量'RANDOM'沒有在FROM子句中定義」

我也試過用RAND()而不是RANDOM和NEWID()。

謝謝。

+0

'SELECT q FROM AS AS q ORDER BY RANDOM()'但它會以隨機順序返回所有行。 – vels4j

+0

[隨機選擇行通過JPA]的可能重複(http://stackoverflow.com/questions/2459119/random-select-rows-via-jpa) –

回答

0

據我瞭解,你想從表中選擇隨機問題。你寧願使用WHERE子句,從你的代碼提供了一些參數,如:

SELECT q FROM Question AS q WHERE id = :id 

然後在代碼,創建您的查詢,您必須產生隨機ID來選擇:

query.setParam("id", getRandomId()); 

要獲得隨機ID,您可能需要查詢來自DB的行數,並使用java.util.Random.nextInt(rowsCount)(當然,如果所有ID都在那裏)。

順便說一句,類似的事情在這裏描述:http://www.shredzone.de/cilla/page/53/how-to-fetch-a-random-entry-with-hibernate.html

+4

這隻適用於如果ids在數據庫上連續。 –

+1

除了@JamesNewman提到的,['nextInt'](https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-)可以返回'0' –

+1

..並且最大值是獨佔的,所以你應該給隨機結果加1。 –

6

爲了得到一個隨機行,第一個獲得總問題的列表,並得到任何一個。

public Question getRandomQuestion(EntityManager em) { 
    Query countQuery = em.createNativeQuery("select count(*) from Question"); 
    long count = (Long)countQuery.getSingleResult(); 

    Random random = new Random(); 
    int number = random.nextInt((int)count); 

    Query selectQuery = em.createQuery("select q from Question q"); 
    selectQuery.setFirstResult(number); 
    selectQuery.setMaxResults(1); 
    return (Question)selectQuery.getSingleResult(); 
} 

注意:您可能需要實施邏輯以避免重複調用多次的方法。

+0

如果我理解正確,你給隨機1問題的解決方案。但如果我想要幾個?我試圖用setMaxResult(4)從DB獲取4個問題,但是它給了我4個問題,它們在數據庫中的順序是相同的(假設第一個問題是隨機問題5,其他3個問題來自DB)是6,7和8),但我希望其他3個問題也是隨機的。什麼是最好的方式來做到這一點?謝謝 – user3168286

+1

@ user3168286你需要調用這個方法n次得到n個隨機問題。你也許需要實現一個邏輯來跳過重複,因爲使用了隨機數 – vels4j

+0

@ Mr.Pichler在投票前是否嘗試過?我回答假設ids從(1,2,3 .... n)開始。 – vels4j