JOOQ在orderBy方法中结合Field和SortField?

The*_*hin 4 java mysql sql-order-by jooq

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

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

但在编写以下代码时,我的 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*der 5

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

你的TABLE_NAME.ENUM_TYPE.desc()是 a SortField,而DSL.rand()是 a Field。为了使这项工作有效,您必须通过调用:来DSL.rand()创建, 。SortFieldDSL.rand().asc()

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