有没有人有关于如何从数据库中获取10个随机唯一对象列表的HQL查询?
应该在数据库中而不是在应用程序中完成。我想获得一些比我目前的解决方案更好的性能,这几乎可以提出10个请求来提交列表。
答案 0 :(得分:10)
HQL类似于:
session.createQuery("select o from Object o order by rand()")
.setMaxResults(10)
.list()
将rand()传递给数据库,因此将其替换为数据库使用的任何函数。
答案 1 :(得分:5)
我无论如何都不是HQL专家,但在SQL中你会用
来做select ... order by RANDOM() limit 10
通过一些谷歌搜索,我弄清楚如何做limit bit和random bit。
答案 2 :(得分: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;
}