Код JOOQ для выбора строк с последней отметкой времени из таблицы - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в JOOQ.У меня есть случай, когда мне нужно выбрать строки, которые имеют последнее значение поля отметки времени из таблицы.

Моя таблица разбита по дате события.Поэтому, когда я запрашиваю таблицу, я получаю несколько записей для одного и того же идентификатора.Теперь я не хочу получать много записей для одного и того же идентификатора, вместо этого мне нужно, чтобы была возвращена только одна запись с последним значением поля метки времени.

Используя базовый синтаксис 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 объекты, и каждый отдельный объект является записью, которая имеет последнее значение метки времени?В моей таблице есть поле с именем timestamp, в зависимости от того, что мне нужно для этого.

Обновить вопрос

Допустим, мне нужно получить список студентов, у которых есть последняя дата событиясо всех перегородок.Ниже приведен мой запрос Jooq, но он возвращает только один объект типа MyStudent.

Вопрос - Как применить ограничения для определенного идентификатора.Учитывая список из n идентификаторов, мне нужно получить n объектов Mystudent, где каждый объект имеет максимальное значение event_date

Ниже приведен запрос, который возвращает только 1 объект

У меня есть еще один вопрос, как мнесделать это без присоединения.Ниже приведен код Jooq, который работает только для одного идентификатора.Но моя функция принимает список идентификаторов и получает записи из таблицы.

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 идентификаторов (например), как мне получить 3 объекта класса Mystudent, где каждый объект имеет максимум(event_date) запись.Если я использую лимит, он вернет только первую запись идентификатора.Если я не использую лимит, он вернет все повторяющиеся строки, которые являются старыми для идентификатора.

1 Ответ

0 голосов
/ 04 февраля 2019

Я перевожу запрос из ваших комментариев в 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();
...