3

SQLを次のようにしたい:

Book b から b を選択 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 に RANDOM 関数ではなく RAND 関数があるためです。これを修正するには、次のようにランダム関数を 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 に答える