2010-12-11 94 views

回答

4

我以任何方式不HQL专家,但在SQL你会做这与

select ... order by RANDOM() limit 10 
有一点谷歌搜索的

所以,我想通了如何做limit bitrandom bit

+0

请在您的文章或不使用签名或标语(http://stackoverflow.com/faq#signatures)。 – meagar 2010-12-11 05:44:40

0

请随时评论和发布改进。这是我的了:

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会是这样的:

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

兰特()通过在数据库中,以便与任何功能的数据库使用替换此通过。

相关问题