【发布时间】: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)。您的示例数据集实际上应该是您用于单元测试的数据集;涵盖您知道需要考虑的边缘情况。然后你可以包含你期望的结果
-
我已经更新了我的帖子