【问题标题】:Does Querydsl not support rand()?Querydsl 不支持 rand() 吗?
【发布时间】:2013-03-29 22:55:31
【问题描述】:

我想让 SQL 看起来像:

通过 rand() 从 Book b order 中选择 b

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

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

谢谢。

【问题讨论】:

  • 什么是rand?您尝试在哪个 RDBMS 上执行此操作?
  • rand() 方法是 RDBMS 函数。我把它和mysql一起用了。

标签: java querydsl


【解决方案1】:

Querydsl SQL 支持通过

NumberExpression.random()

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

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

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

【讨论】:

  • 蒂莫。它发生错误“错误:FUNCTION bookstore_web.random 不存在”。我的环境是 QueryDSL 3.1 和 Hibernate 4.1.10.Final。
  • Querydsl SQL 支持它,我不知道 JPQL 支持它,你要求 SQL。
  • @xyzlast 如果您发现 JPQL 支持随机性,请告诉我。为了更清楚,我也更新了我的答案。
  • 我不知道 JPQL 是如何支持随机的。我认为现在不可能。所以我将它与 Hibernate HQL 一起使用。看起来像这样。会话会话 = (会话) getEntityManager().getDelegate(); return (List) session.createQuery("from Book order by rand()").list();
  • 感谢您的关注。我认为 QueryDSL 是一个很好的解决方案。 :)
【解决方案2】:

对 Timo 的回答的补充。

如果你使用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);

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 2022-08-10
    • 1970-01-01
    • 2017-03-11
    • 2018-04-06
    • 1970-01-01
    • 2016-12-26
    • 2021-11-14
    • 2017-03-16
    相关资源
    最近更新 更多