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

问题描述 投票:2回答:1

我是新来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);
}

预期结果:我如何得到它具有明显的List<MyClass>对象和每个不同的对象是具有最新时间戳值的记录一个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个IDS(例如),如何抓3 Mystudent类对象,其中每个对象是(EVENT_DATE)记录的最大集合。如果我使用的限制,它只会返回第一个ID记录。如果我不使用的限制,这将返回所有这些都是旧的ID重复的行。

mysql sql jooq
1个回答
2
投票

我翻译从您的意见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();
© www.soinside.com 2019 - 2024. All rights reserved.