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

时间:2019-02-01 17:18:54

标签: mysql sql jooq

我是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个对象的查询

我还有一个问题,我如何在没有加入的情况下做到这一点。以下是Jooq代码,仅适用于一个id。但是我的函数接受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 个答案:

答案 0 :(得分:1)

我正在将查询从您的评论翻译为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();