用于从表中选择具有最新时间戳的行的 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<MyClass>
,并且每个不同的对象都是具有最新时间戳值的记录?我的表有一个名为时间戳的字段,基于此我需要实现这一点。
更新问题
假设我必须从所有分区中获取具有最新 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 代码的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择最新的带时间戳的值,该表对于一个列 id 有多个条目,对于每个唯一的列 id 和来自另一个表的数据