我有一个包含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)中没有重复的记录 (如果我们有许多同名+姓氏的记录,那么我们只返回一条记录,可以说任何人)
结果将是
- 1 Konan toto doctor 45
- 2 Konan tata doctor 50
- 6 pikar popo doctor 99
- 7 simba popo doctor 72
ID为3的记录被删除,因为在(name,firstName)上有重复的记录,因为我们只需要job = doctor
什么是Hibernate查询才能获得所需的结果?
答案 0 :(得分:2)
我不确定为什么必须使用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 per category problem的特例。我建议使用本机查询,如果确实需要,您仍然可以将其映射到实体。