2010-12-11 51 views
5

Quelqu'un at-il une requête HQL sur la façon d'obtenir la liste de 10 objets uniques aléatoires de la base de données?Comment obtenir la liste de 10 objets uniques au hasard avec Hibernate?

Cela devrait être fait dans la base de données non dans l'application. Je voudrais obtenir quelque chose qui a de meilleures performances que ma solution actuelle qui fait à peu près 10 demandes pour obtenir la liste classée.

Répondre

4

Je ne suis pas expert HQL par tout moyen, mais dans SQL vous devez faire cela avec

select ... order by RANDOM() limit 10 

Donc, avec un peu de googler, je me suis dit comment faire le limit bit et le random bit.

+0

Veuillez ne pas utiliser de signatures ou de slogans (http://stackoverflow.com/faq#signatures) dans vos publications. – meagar

0

N'hésitez pas à commenter et poster des améliorations. Voilà ce que je suis:

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 serait quelque chose comme:

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

Le rand() est passé à travers la base de données pour le remplacer par quelque fonction de votre base de données utilise.