我正在尝试从 MySQL 表中选择一个随机记录列表,但优先考虑某些 ENUM 类型。当我在终端中运行以下纯 SQL 查询时,它工作正常:

select * from table_name where expires <= UNIX_TIMESTAMP()*1000
order by enum_type desc, rand() limit 500;

但是在编写以下代码时,我的 IDE 出现编译错误:
private List<FooRecord> getNextRecordsWeighted(Condition condition, int recordLimit) {
    final long timeNow = System.currentTimeMillis();
    return context.selectFrom(TABLE_NAME).where(TABLE_NAME.EXPIRES.lessOrEqual(timeNow)).
        orderBy(TABLE_NAME.ENUM_TYPE.desc(), DSL.rand()).limit(recordLimit).fetch();
}

现在,我的 IDE 说的是,显然没有我可以调用的兼容方法来执行此操作。我将如何解决这个问题?有解决方法吗?

最佳答案

问题在于 orderBy() 方法的各种重载。你有:

  • SelectOrderByStep(Field, Field)
  • SelectOrderByStep(SortField, SortField)

  • 您的 TABLE_NAME.ENUM_TYPE.desc()SortField ,而 DSL.rand()Field 。为了完成这项工作,您必须通过调用 DSL.rand() 使 SortField 成为 DSL.rand().asc()

    我认识到这是 API 中的一个缺陷,可能会在 jOOQ 的 future 版本中修复。我为此修复创建了一个 GitHub 问题:#3631

    关于java - JOOQ 在 orderBy 方法中结合 Field 和 SortField?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25866957/

    10-12 06:19