2010-12-11 19 views
5

データベースから10個のランダムな一意のオブジェクトのリストを取得する方法について誰かがHQLクエリを持っていますか?Hibernateで10個のランダムな一意のオブジェクトのリストを取得するには?

アプリケーションではないデータベースで行う必要があります。私は、現在のソリューションよりも優れた性能を持つものを手に入れたいと思っています。これは、リストを手に入れるための要求が10件ほどあります。

答えて

4

私は任意の手段によって全くHQLの専門家だが、SQLにあなたがグーグルのビットとそう

select ... order by RANDOM() limit 10 

でこれを行うだろうが、私はlimit bitrandom bitを行う方法を考え出しました。

+0

あなたの投稿に[署名またはタグラインを使用しない](http://stackoverflow.com/faq#signatures)をお願いします。 – meagar

0

ご意見、ご感想をお寄せください。これは私が得たものである:()データベースはので、あなたのデータベースを使用していますどんな機能でこれを置き換えるために通過させ

session.createQuery("select o from Object o order by rand()") 
    .setMaxResults(10) 
    .list() 

ランド:

public List<Item> getRandomTenItems() { 

    DetachedCriteria criteria = DetachedCriteria.forClass(Item.class).addOrder(Order.desc("id")); 
    List<Item> idlist = new LinkedList<Item>(getHibernateTemplate().findByCriteria(criteria, 0, 1)); 
    long max = idlist.get(0).getId(); 

    criteria = DetachedCriteria.forClass(Item.class).addOrder(Order.asc("id")); 
    idlist = new LinkedList<Item>(getHibernateTemplate().findByCriteria(criteria, 0, 1)); 
    long min = idlist.get(0).getId(); 

    List<Item> rtn = new LinkedList<Item>(); 
    HashSet<Long> ids = new HashSet<Long>(); 
    int i=0; 
    while(i<10) { 
     long itemId = RandomUtils.rand(min, max); 
     if(ids.contains(itemId)) continue; 
     List<Item> list = new LinkedList<Item>(getHibernateTemplate().findByNamedParam(
       "from Item where archived = false and available = true and id = :itemId", "itemId", itemId)); 
     if(!list.isEmpty()){ 
      rtn.add(list.get(0)); 
      ids.add(list.get(0).getId()); 
      i++; 
     } 
    } 
    return rtn; 
} 
7

HQLは次のようになります。

関連する問題