【问题标题】:SQL query with 1:n relation, find all entities which have two matching children matching具有 1:n 关系的 SQL 查询,查找具有两个匹配子对象的所有实体
【发布时间】:2018-07-18 16:01:50
【问题描述】:

我有一个简单的父子关系(1:n,@OneToMany),由 JPA 映射。

一个孩子(除其他外)具有以下属性:

  • 用户
  • 类型

我现在要查找所有父元素,它们至少具有以下两个子元素:

  • 用户 = 'user1' 和类型 = 'type1' AND 的第一个孩子
  • 用户 = 'user2' 和类型 == 'type2' 的第二个孩子 或
  • 用户 = 'user1' 和类型 = 'type2' AND 的第一个孩子
  • 用户 = 'user2' 和类型 = 'type1' 的第二个孩子

例如一个实体可以有 10 个孩子,但其中两个必须符合上述条件。

您对如何使用 SQL/JPA Criteria API 进行处理有任何提示吗?

EXISTS 子句是要走的路吗,像这样:

SELECT * FROM Parent parent
WHERE EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND    child.type = 'type1' OR ...) AND child.id=parent.id)
OR
EXISTS (SELECT child FROM Child WHERE (child.user = 'user1' AND child.type = 'type2' OR ...) AND child.id=parent.id)

感谢您的帮助!

更新: 父代表一个“邮件”,子关系代表邮件的发送者和接收者,像这样:

Parent Table (Mail):
|id | subject     |
|1  | Hello World |
|2  | Foo Bar     |
|3  | Example     |
|4  | Test        |

Child Table:
|id | user      | type     |
|1  | user1@mail| SENDER   |
|1  | user2@mail| RECEIVER |
|1  | user3@mail| RECEIVER |
|2  | user1@mail| SENDER   |
|2  | user4@mail| RECEIVER |
|2  | user5@mail| RECEIVER |
|3  | user2@mail| SENDER   |
|3  | user1@mail| RECEIVER |
|3  | user5@mail| RECEIVER |
|4  | user3@mail| SENDER   |
|4  | user1@mail| RECEIVER |
|4  | user2@mail| RECEIVER |

子表的主键是(id,user,type)的复合键。 id 列是 1:n 关系的连接列。

我想查找所有由 user1 发送并由 user2 接收的邮件,反之亦然,例如两个用户之间交换的邮件。

示例输入:'user1'、'user2' 结果:邮件 1 和 3,但不是邮件 4,因为在邮件 4 中,两个用户都只是接收者。

【问题讨论】:

  • 你能把实时场景放在这里吗?比如,你到底在做什么?这个孩子的父母有点困惑。
  • 举个例子(阅读本文:stackoverflow.com/help/mcve。您的示例数据集实际上应该是您用于单元测试的数据集;涵盖您知道需要考虑的边缘情况。然后你可以包含你期望的结果
  • 我已经更新了我的帖子

标签: java sql database jpa


【解决方案1】:

一个巧妙的技巧是计算这样一个父母拥有的唯一孩子的数量:

SELECT * 
FROM   parent p
WHERE  EXISTS (SELECT   child_id
               FROM     child c
               WHERE    user IN ('user1', 'user2') AND
                        type IN ('type1', 'type2') AND
                        c.parent_id = p.id
               GROUP BY child_id
               HAVING   COUNT(DISTINCT user) = 2 AND
                        COUNT(DISTINCT type) = 2)

【讨论】:

  • 谢谢,但我想这也会找到具有 user1/type1 和 user2/type1 的父母。所有用户必须有不同的类型。
  • @sco0ter 好点。您可以检查用户的数量和类型 - 请参阅我编辑的答案
  • 谢谢,您的陈述看起来很有希望!伟大的工作
猜你喜欢
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2022-01-18
  • 2016-10-18
  • 2013-11-20
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多