用于从表中选择具有最新时间戳的行的 JOOQ 代码

Posted

技术标签:

【中文标题】用于从表中选择具有最新时间戳的行的 JOOQ 代码【英文标题】:JOOQ code to select rows which has latest timestamp from table 【发布时间】:2019-06-26 07:24:29 【问题描述】:

我是 JOOQ 的新手。我有一个用例,我需要从表中选择具有最新时间戳字段值的行。

我的表按事件日期分区。所以当我查询表时,我会得到同一个 id 的多条记录。现在我不想为同一个 id 获取很多记录,而是只需要返回一个具有最新时间戳字段值的记录。

使用基本的 SQL 语法我能够实现这一点,但我无法通过 JOOQ 实现它。

SQL:

select * 
from abc.student t 
inner join (
  select id, max(event_date) as MaxDate 
  from abc.student group by id 
) tm on t.id = tm.id and t.event_date = tm.MaxDate ;

Java:

public Iterable<MyClass> fetchMyRecords(Iterable<String> MyIds) 
    return dslContext.selectFrom(MYTABLE)
    WHERE(MYTABLE.ID.in(List.newArrayList(ids)))
    .fetchInto(MyObject.class);

预期结果:如何获得具有不同MyClass 对象的List&lt;MyClass&gt;,并且每个不同的对象都是具有最新时间戳值的记录?我的表有一个名为时间戳的字段,基于此我需要实现这一点。

更新问题

假设我必须从所有分区中获取具有最新 event_date 的学生列表。下面是我编写的 Jooq 查询,但它只返回一个 MyStudent 类型的对象。

问题 - 我如何对特定 id 应用限制。给定 n 个 id 的列表,我需要获取 n 个 Mystudent 对象,其中每个对象具有最大 event_date

下面是只返回 1 个对象的查询

我还有一个问题,我如何在没有加入的情况下做到这一点。以下是仅适用于一个 id 的 Jooq 代码。但我的函数接受 id 列表并从表中获取记录。

public Iterable<MyClass> fetchMyRecords(Iterable<String> MyIds) 
return dslContext.select().from(TABLE)
.where(TABLE.ID.in(Lists.newArrayList(ids)))
.orderBy(TABLE.EVENT_DATE.desc())
.limit(1)
.fetchInto(MyStudent.class); 

因此,给定一组 3 个 id(例如),我如何获取 3 个 Mystudent 类对象,其中每个对象是 (event_date) 记录的最大值。如果我使用限制,它只会返回第一个 id 记录。如果我不使用限制,它将返回所有旧的 ID 重复行。

【问题讨论】:

你能回答我的更新问题吗? 【参考方案1】:

我正在将您的 cmets 中的查询翻译成 jOOQ:

// Assuming these static imports
import static org.jooq.impl.DSL.*;
import static com.example.generated.Tables.*;

Student t = STUDENT.as("t");
Field<Date> maxDate = max(STUDENT.EVENT_DATE).as("MaxDate");
Table<?> tm = table(select(STUDENT.ID, maxDate)
                   .from(STUDENT)
                   .groupBy(STUDENT.ID)).as("tm");

ctx.select()
   .from(t)
   .join(tm)
   .on(t.ID.eq(tm.field(STUDENT.ID)))
   .and(t.EVENT_DATE.eq(tm.field(maxDate)))
   .fetch();

【讨论】:

感谢@Lukas Eder。你能帮我解决更新问题吗

以上是关于用于从表中选择具有最新时间戳的行的 JOOQ 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Jquery 从表中查找按列指定的行的索引和值?

从表中选择最新的带时间戳的值,该表对于一个列 id 有多个条目,对于每个唯一的列 id 和来自另一个表的数据

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

如何为每个键值选择具有最新时间戳的行?

JOOQ 从表中获取列

从表中选择具有最大日期的行