Hibernate Query без дубликатов на две колонки - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть таблица с 5 столбцами, подобная этой:

id, name, firstName, job, number

В этой таблице много записей.Теперь представьте эти записи:

 - 1 Konan toto doctor  45
 - 2 Konan tata doctor  50
 - 3 Konan toto doctor  60
 - 4 simba popo police  44
 - 5 simba tata police  88
 - 6 pikar popo doctor  99
 - 7 simba popo doctor  72

Теперь я хочу найти только запись о том, какая работа является врачом, и получить запись без дубликатов (name, firstName) (если у нас много записей с одинаковым именем + lastName, то мывернуть только одну запись, скажем, кому угодно)

результат будет

 - 1 Konan toto doctor  45
 - 2 Konan tata doctor  50
 - 6 pikar popo doctor  99
 - 7 simba popo doctor  72

запись с идентификатором 3 будет удалена, потому что есть дубликаты (name, firstName) для остальных, потому что мы тольконужна работа = доктор

Что такое Hibernate Query для получения желаемых результатов?

1 Ответ

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

Я не уверен, почему это нужно делать с JPQL, это кажется довольно сложным и создает неэффективный запрос, который, вероятно, требует самостоятельного соединения.Вот сравнительно простое решение на основе Oracle SQL

SELECT
  MAX(id)        KEEP (DENSE_RANK FIRST ORDER BY id) AS id,
  name,
  firstName,
  MAX(job)       KEEP (DENSE_RANK FIRST ORDER BY id) AS job,
  MAX(number)    KEEP (DENSE_RANK FIRST ORDER BY id) AS number
FROM t
WHERE job = 'doctor'
GROUP BY name, firstName

Более совместимое с стандартами решение с использованием оконных функций:

SELECT
FROM (
  SELECT
    id, name, firstName, job, number,
    ROW_NUMBER() OVER (PARTITION BY name, firstName ORDER BY id) rn
  FROM t
  WHERE job = 'doctor'
) t
WHERE rn = 1

Это особый случай проблемы top N на категорию.Я рекомендую использовать собственный запрос, который можно по-прежнему отображать на объекты, если вам это действительно нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...