3

我想让 SQL 看起来像:

select b from Book b order by rand()

如何将该查询转换为 Querydsl 查询?

Querydsl 不支持吗?如果您知道支持此查询的方式,请回答..;

谢谢你。

4

2 回答 2

7

Querydsl SQL 通过

NumberExpression.random()

所以你的查询可以这样表达

query.from(b)
    .orderBy(NumberExpression.random().asc())
    .list(b);

我不确定它对 JPQL 的支持程度如何,它似乎不在标准中。

于 2013-04-08T08:10:01.023 回答
1

蒂莫回答的补充。

如果你使用 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);
于 2017-05-15T12:44:33.987 回答