通过JPA随机选择行

12

在MySQL中,

SELECT id FROM table ORDER BY RANDOM() LIMIT 5

这个 SQL 可以选择 5 行随机数据。如何通过 JPA 查询实现此功能(使用 Hibernate 作为提供程序,MySQL 数据库)?

谢谢。

3个回答

12

只有规范中定义的函数才保证被所有JPA提供商支持,RANDRANDOM不在其中。因此我认为你无法在JPQL中实现它。

但是,在HQL中可以实现(HQL中的order by子句会传递到数据库,因此您可以使用任何函数):

String query = "SELECT o.id FROM Order o ORDER BY random()";
Query q = em.createQuery(query);
q.setMaxResults(5);

但是,我再说一遍:

  1. 这可能在另一个数据库中不起作用。
  2. 这可能在另一个JPA提供者中不起作用。

0

尝试预先计算随机值,并使用预先计算的随机值构建您的JPQL/HQL/本地查询。


rand()或random()会为每一行生成一个随机值,因此预先生成单个随机值是不起作用的。 - Noah Yetter

0
我只是通过一种简单的方式实现了这个,这可能看起来并不十分优美,但它能够达到目的。这个解决方案仅适用于Java 8或以上版本,我正在使用Spring Boot。
首先,我有以下服务调用,它将为我的默认Repository接口方法提供一个EntityManager,自动装配是单例的,因此我相信这是性能友好的。
 @PersistenceContext
 private EntityManager entityManager;
    

 @Override
 public UserResp getRandomUser() {
        long orderByRandom = (long) ((java.lang.Math.random()*100 % 10 )+1);
        return userMapper.entityToModel(userRepository.pickRandomUser(orderByRandom,entityManager));
    }

然后我的代码库看起来像这样
 @Transactional
    default User pickRandomUser(Long rand, EntityManager manager)  {
        return manager.createQuery("SELECT u FROM User u ORDER BY "+rand,User.class).setMaxResults(1).getSingleResult();
    }

这应该适用于任何数据库。 - Mohammed Housseyn Taleb

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