代码之家  ›  专栏  ›  技术社区  ›  MatBanik

通过Hibernate从SQL数据库中获取随机对象

  •  3
  • MatBanik  · 技术社区  · 15 年前

    我有以下依赖于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 回复  |  直到 15 年前
        1
  •  2
  •   rogerdpack    11 年前

    请参阅此链接: 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,但我不知道一种更优雅、更易于使用的方法。我知道你应该把这个方法包装在一个门面后面。