在两列上没有重复的Hibernate查询

时间:2019-02-19 09:57:50

标签: oracle hibernate jpql

我有一个包含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查询才能获得所需的结果?

1 个答案:

答案 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的特例。我建议使用本机查询,如果确实需要,您仍然可以将其映射到实体。