Получить случайный объект из базы данных SQL через Hibernate - PullRequest
3 голосов
/ 20 ноября 2010

У меня следующий MySql-зависимый код (ORDER BY RAND ()). Я хотел бы знать, есть ли Hibernate HQL альтернатива для этого (admin это логический тег, указывающий, что пользователь в качестве администратора). Это рабочий код:

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

1 Ответ

2 голосов
/ 20 ноября 2010

Смотрите эту ссылку: 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, я не знаю более элегантного способа, которым легко пользоваться. Имхо, ты должен обернуть этот метод за фасадом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...