如何使用Hibernate获取10个随机且唯一的对象列表?

7

有人有关于如何从数据库中获取10个随机唯一对象列表的HQL查询吗?

它应该在数据库中完成,而不是在应用程序中完成。我想得到比我当前解决方案更好性能的东西,我的当前解决方案需要进行10次请求才能填满列表。

3个回答

11

HQL的示例:

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

将rand()函数替换为您的数据库使用的任何函数,因为rand()函数会传递到数据库中。


5

我并不是HQL专家,但在SQL中,您可以通过以下方式实现:

select ... order by RANDOM() limit 10

通过一些搜索,我找到了如何实现 限制查询随机排序 的方法。


请在您的帖子中不要使用签名或标语 - user229044

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接