我是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重复行。
答案 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();