我想让 SQL 看起来像:
select b from Book b order by rand()
如何将该查询转换为 Querydsl 查询?
Querydsl 不支持吗?如果您知道支持此查询的方式,请回答..;
谢谢你。
Querydsl SQL 通过
NumberExpression.random()
所以你的查询可以这样表达
query.from(b)
.orderBy(NumberExpression.random().asc())
.list(b);
我不确定它对 JPQL 的支持程度如何,它似乎不在标准中。
蒂莫回答的补充。
如果你使用 mysql 你会得到错误“ERROR: FUNCTION schema.random does not exist”,这是因为 mysql 有一个 RAND 函数而不是一个 RANDOM 函数。要解决此问题,您可以在 sql 中添加随机函数,如下所示:
DROP FUNCTION IF EXISTS RANDOM;
DELIMITER $$
CREATE FUNCTION RANDOM ()
RETURNS DECIMAL(15,15)
DETERMINISTIC
BEGIN
DECLARE dist DECIMAL(15,15);
SET dist = RAND();
RETURN dist;
END$$
DELIMITER ;
或者修复随机函数以使用 rand :
public class MySQLJPATemplates extends JPQLTemplates {
public static final MySQLJPATemplates DEFAULT = new MySQLJPATemplates();
public MySQLJPATemplates() {
this(DEFAULT_ESCAPE);
add(Ops.MathOps.RANDOM, "rand()");
add(Ops.MathOps.RANDOM2, "rand({0})");
}
public MySQLJPATemplates(char escape) {
super(escape);
}
}
并使用如下模板:
JPAQuery<Route> query = new JPAQuery<Route>(em, MySQLJPATemplates.DEFAULT);
query.from(b)
.orderBy(NumberExpression.random().asc())
.list(b);