Querydsl不支持rand()吗?

时间:2013-04-07 23:55:40

标签: java querydsl

我想让SQL看起来像:

select b from Book b order by rand()

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

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

谢谢。

2 个答案:

答案 0 :(得分:7)

Querydsl SQL通过

支持它
NumberExpression.random()

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

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

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

答案 1 :(得分:1)

Timo回答的补充。

如果您使用mysql,您将收到错误" ERROR:FUNCTION schema.random不存在",这是因为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);