SQLを次のようにしたい:
Book b から b を選択 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 に 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);