Я хотел бы сделать запрос в PostgreSQL
select
distinct on(uuid)
(select nr_zew from bo_get_sip_cti_polaczenie_info(uuid)) as nr_zew
from bo_sip_cti_event_day
where data_ins::date = current_date
and kierunek like 'P'
and (hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE')
на Java, насколько я могу
Result<Record> result = create
.select()
.from("bo_sip_cti_event_day")
.where("data_ins::date = current_date")
.and("kierunek like 'P'")
.and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
.fetch();
и он работает, но когда я пытаюсь добавить
Result<Record> result = create
.selectDistinct("uuid")
.from("bo_sip_cti_event_day")
.where("data_ins::date = current_date")
.and("kierunek like 'P'")
.and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
.fetch();
то он говорит, что не может сделать selectDistinct(String).
Как я могу использовать различные jOOQ?
Это определенно неочевидно. После выбора фактических столбцов существует метод SelectDistinctOnStep.distinctOn()
. Причина, по которой это неочевидно обнаружить, заключается в том, что сам синтаксис PostgreSQL немного сложно моделировать во внутреннем DSL, таком как jOOQ.
Подумайте об этом так: вы выбираете набор столбцов (коррелированный подзапрос), указывая, на каких столбцах должен применяться фильтр четкости:
Result<Record> result = create
.select(field("(select nr_zew from bo_get_sip_cti_polaczenie_info(uuid))").as("nr_zew"))
.distinctOn(field("uuid"))
.from("bo_sip_cti_event_day")
.where("data_ins::date = current_date")
.and("kierunek like 'P'")
.and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
.fetch();
Или, если вы используете генератор кода:
Result<Record> result = create
.select(field(
select(BO_GET_SIP_CTI_POLACZENIE_INFO.NR_ZEW)
.from(BO_GET_SIP_CTI_POLACZENIE_INFO.call(BO_SIP_CTI_EVENT_DAY.UUID))).as("nr_zew"))
.distinctOn(BO_SIP_CTI_EVENT_DAY.UUID)
.from(BO_SIP_CTI_EVENT_DAY)
.where(BO_SIP_CTI_EVENT_DAY.cast(Date.class).eq(currentDate()))
.and(BO_SIP_CTI_EVENT_DAY.KIERUNEK.like("P"))
.and(BO_SIP_CTI_EVENT_DAY.HANGUP_CAUSE.like("NO_ANSWER")
.or(BO_SIP_CTI_EVENT_DAY.HANGUP_CAUSE.like("NO_USER_RESPONSE")))
.fetch();
LIKE
Обратите внимание, что символ подчеркивания (_
) является односимвольной wild-картой в SQL, поэтому ваши предикаты LIKE
могут быть не совсем корректными. В идеале просто используйте обычные предикаты сравнения, такие как:
kierunek = 'P'
hangup_cause IN ('NO_ANSWER', 'NO_USER_RESPONSE')
Вы на самом деле не кажется, нужно LIKE
.
distinct on
версии: github.com/jOOQ/jOOQ/issues/3564