我是新来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重复的行。
我翻译从您的意见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();