2010-12-11 9 views

Respuesta

4

No soy un experto HQL por cualquier medio, pero en SQL podría hacer esto con

select ... order by RANDOM() limit 10 

Así que con un poco de google, me di cuenta de cómo hacer el limit bit y la random bit.

+0

Por favor [no use firmas ni eslóganes] (http://stackoverflow.com/faq#signatures) en sus publicaciones. – meagar

0

No dude en comentar y publicar mejoras. Esto es lo que tengo:

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 sería algo así como:

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

El rand() se pasa a través de la base de datos para reemplazar esto con cualquier función utiliza su base de datos.

Cuestiones relacionadas