简单版
如果是Mysql数据库,可以使用rand函数进行随机排序(其他数据库可查找类似的函数生成随机数)。
这里要注意,rand函数是非标准的,JQL本身是不支持rand函数的,需要将nativeQuery设置成true。
@Query(value = "select * from question order by rand() limit ?3 ", nativeQuery = true)
List<Question> randomGenerate(String type, List<String> jobs, int num);
高级版
注解的写法对于复杂的查询不太友好,有时候我们需要借助Specification的方式构建查询。
rand
这种非标准的函数的应用比较少见,类似的函数都可以参照以下示例:
注:Repository需要继承JpaSpecificationExecutor
接口才支持List findAll(Specification spec);
Specification<Question> specification = (root, query, cb) => {
Predicate pd = cb.and(cb.equal(root.get("title"), "测试题"));
Expression<Double> e = new BasicFunctionExpression<>(
(CriteriaBuilderImpl) cb, Double.class, "rand"
);
query.orderBy(cb.desc(e));
return pd;
}
questionRepository.findAll(specification, PageRequest.of(0, 20));