【问题标题】:How to find duplicates in JPA?如何在 JPA 中查找重复项?
【发布时间】:2020-01-23 10:02:56
【问题描述】:

我正在尝试在 CrudRepository 中创建一个能够在我的表中为我提供重复项的方法。我想找到一个同名且生日在同一天的人。为此,我认为这更容易,我想首先找到所有相同的名字,然后我想过滤具有相同生日的名字。 Wished Method 是一种规范,但也可以进行查询。

在 JPA 中有没有办法?

全桌:

ID     Name     Birthday 
1      Jean     11.10.2019     
2      Jones    10.10.2019   
3      Jean     11.10.2019 
4      Jean     12.10.2019     

第一个希望的结果,同名过滤:

ID     Name     Birthday 
1      Jean     11.10.2019
3      Jean     11.10.2019 
4      Jean     12.10.2019     

第二个希望的结果是:

ID     Name     Birthday 
1      Jean     11.10.2019     
3      Jean     11.10.2019 

因为名字“Jean”的生日是同一天。

有人可以帮忙吗?

【问题讨论】:

标签: java spring jpa spring-data-jpa spring-data


【解决方案1】:

您可以使用本机查询,例如:

SELECT Name, Birthday, COUNT(*)
FROM Users
GROUP BY Name, Birthday
HAVING COUNT(*) > 1

这可以和JOIN一起使用来得到想要的结果:

SELECT u.ID, u.Name, u.Birthday FROM Users u
JOIN (SELECT Name, Birthday, COUNT(*) FROM Users GROUP BY Name, Birthday HAVING COUNT(*) > 1) u2 
ON u.Name=u2.Name AND u.Birthday=u2.Birthday

以及没有INNER JOIN的解决方案:

SELECT u.ID, u.Name, u.Birthday
FROM Users u, (SELECT Name, Birthday, COUNT(*) FROM Users GROUP BY Name, Birthday HAVING COUNT(*) > 1) u2 
WHERE u.Name = u2.Name AND u.Birthday = u2.Birthday

【讨论】:

  • 它为我的实体中没有的计数添加了一行“未知”。还有一个分组,这不是我要搜索的内容,如您在上面看到的。我想列出所有结果。但是感谢您的尝试!你的结果是ID Name Birthday unknown 1 Jean 11.10.2019 2
  • 可以通过连接查询:SELECT u.Name, u.Birthday FROM Users u JOIN (SELECT Name, Birthday, COUNT(*) FROM Users GROUP BY Name, Birthday HAVING COUNT(*) > 1) u2 ON u.Name=u2.Name AND u.Birthday=u2.Birthday
  • 好的。如果您不需要加入字段:SELECT u.ID, u.Name, u.Birthday FROM Users u, (SELECT Name, Birthday, COUNT(*) FROM Users GROUP BY Name, Birthday HAVING COUNT(*) > 1) u2 WHERE u.Name = u2.Name AND u.Birthday = u2.Birthday
  • Axifive 为您提供了解决问题所需的所有信息,尽管他没有为您提供解决方案。只需从表格中选择正确的列,使其适合您的实体。
【解决方案2】:

使用 Spring JPA 标准

参见https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/的示例

https://www.baeldung.com/spring-data-criteria-queries

因为你没有展示你的实体,所以我不能更明确地实现编码。

【讨论】:

  • 我知道链接,但没有该场景的示例。感谢任何地方。
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多