我有以下 MySql 相关代码 (ORDER BY RAND())。我想知道是否有 hibernate HQL 替代品(admin 是 boolean 标记,表示用户是管理员)。这是工作代码:
public long getRandomAdmin() {
Session session = getSession();
Query selectQuery = session.createSQLQuery("SELECT user_id FROM users WHERE admin = '1' ORDER BY RAND()");
selectQuery.setMaxResults(1);
List<BigInteger> list = null;
try {
list = selectQuery.list();
} catch (HibernateException e) {
log.error(e);
throw SessionFactoryUtils.convertHibernateAccessException(e);
}
if (list.size() != 1) {
log.debug("getRandomAdmin didn't find any user");
return 0;
}
log.debug("found: " + list.get(0));
return list.get(0).longValue();
}
最佳答案
请参阅此链接: http://www.shredzone.de/cilla/page/53/how-to-fetch-a-random-entry-with-hibernate.html
Criterion restriction = yourRestrictions;
Object result = null; // will later contain a random entity
Criteria crit = session.createCriteria(Picture.class);
crit.add(restriction);
crit.setProjection(Projections.rowCount());
int count = ((Number) crit.uniqueResult()).intValue();
if (0 != count) {
int index = new Random().nextInt(count);
crit = session.createCriteria(Picture.class);
crit.add(restriction);
result = crit.setFirstResult(index).setMaxResults(1).uniqueResult();
}
这就是你想要的。保持 Hibernate 作为抽象层,同时仍然能够查询随机对象。不过,性能会受到一些影响。
虽然我一直在使用Hibernate,但我不知道更优雅、更易于使用的方式。恕我直言,您应该将该方法包装在外观后面。
关于java - 通过 Hibernate 从 SQL 数据库中获取随机对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232934/