2010-11-20 11 views
3

次のMySql依存コード(ORDER BY RAND())があります。私はそれのためのHibernate HQLの代替があるかどうかを知りたいです(adminは管理者としてのユーザを示すbooleanタグです)。これは動作するコードです:Hibernateを介してSQLデータベースからランダムオブジェクトを取得

public long getRandomAdmin() { 
    Session session = getSession(); 
    Query selectQuery = session.createSQLQuery("SELECT user_id FROM users WHERE admin = '1' ORDER BY RAND()"); 
    selectQuery.setMaxResults(1); 

    List<BigInteger> list = null; 
    try { 
     list = selectQuery.list(); 
    } catch (HibernateException e) { 
     log.error(e); 
     throw SessionFactoryUtils.convertHibernateAccessException(e); 
    } 

    if (list.size() != 1) { 
     log.debug("getRandomAdmin didn't find any user"); 
     return 0; 
    } 
    log.debug("found: " + list.get(0)); 

    return list.get(0).longValue(); 
} 
+0

[Hibernate Criteria API:n個のランダムな行を取得する]の複製が可能です。(http://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n-random-rows) –

答えて

2

は、このリンクを参照してください: http://www.shredzone.de/cilla/page/53/how-to-fetch-a-random-entry-with-hibernate.html

Criterion restriction = yourRestrictions; 
Object result = null; // will later contain a random entity 
Criteria crit = session.createCriteria(Picture.class); 
crit.add(restriction); 
crit.setProjection(Projections.rowCount()); 
int count = ((Number) crit.uniqueResult()).intValue(); 
if (0 != count) { 
    int index = new Random().nextInt(count); 
    crit = session.createCriteria(Picture.class); 
    crit.add(restriction); 
    result = crit.setFirstResult(index).setMaxResults(1).uniqueResult(); 
} 

これはあなたが望むものです。抽象レイヤとしてHibernateを維持しながら、依然としてランダムオブジェクトを照会できます。パフォーマンスは少しでも苦しんでいます。

私はHibernateをたくさん使っていましたが、使いやすいよりエレガントな方法はわかりません。 Imhoあなたはファサードの背後にその方法をラップする必要があります。

+1

hibernate doesn 'これらの実装をデータベース間で非表示にすることはできません。この方法では[rand()http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql]ランダムな行が1つしか返されないので、X個のランダムなエントリFWIWが必要な場合は、Xクエリを実行する必要があります。別のオプションは、Oracleの "rand"関数を "dbms_random.value"として登録する独自のカスタムhibernateダイアレクトを作成することです。 rogerdpack

+0

http://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n- random-rowsは実装が簡単です –

+0

0とmaxIdの間にIDがない場合は、レコードを返さないことがあります。 – vadim

関連する問題