2010-12-11 2 views
5

Qualcuno ha una query HQL su come ottenere un elenco di 10 oggetti univoci casuali dal database?Come ottenere un elenco di 10 oggetti univoci casuali con Hibernate?

Dovrebbe essere fatto nel database non in applicazione. Mi piacerebbe ottenere qualcosa che abbia prestazioni migliori rispetto alla mia attuale soluzione che fa quasi 10 richieste per ottenere la lista archiviata.

risposta

4

Non sono un esperto HQL con qualsiasi mezzo, ma in SQL si potrebbe fare questo con

select ... order by RANDOM() limit 10 

Così con un po 'di googling, ho capito come fare il limit bit e random bit.

+0

Si prega di [non utilizzare firme o tagline] (http://stackoverflow.com/faq#signatures) nei tuoi messaggi. – meagar

0

Non esitate a commentare e pubblicare miglioramenti. Questo è quello che ho ottenuto:

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 sarebbe qualcosa di simile:

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

Il rand() viene fatto passare attraverso al database in modo sostituire questo con qualunque funzione utilizza il database.