【发布时间】:2013-12-28 14:26:05
【问题描述】:
Table A: Table A_B: Table B:
id | a a_id | b_id id | b
------ ----------- ------
1 | w 1 | 1 1 | s
2 | x 1 | 2 2 | t
3 | y 2 | 4 3 | u
4 | z 4 | 4 4 | v
现在我想从表 A WHERE B.id = 1 AND B.id = 2 中获取所有条目。
目前我必须遵循以下代码:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
我在这里卡住了。 WHERE b.id IN (...) 给了我表 A 中的所有条目,其中b.id = 1 OR b.id = 2当然,WHERE b.id = 1 AND b.id = 2 根本没有给出任何结果......
我找到的唯一可能的解决方案是使用INTERSECT:
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 1
INTERSECT
SELECT *
FROM A a
JOIN A_B ab ON a.id = ab.a_id
JOIN B b ON ab.b_id = b.id
WHERE b.id = 2
但我可以拥有无限数量的 b.id。所以这个查询会变得很慢...
难道没有像IN 这样的东西表现得像我想要的那样吗?并且应该使用 Criteria Query 来实现:
Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...
但我也会对纯 SQL 解决方案感到满意。
【问题讨论】:
-
我不确定我是否正确理解了这个问题,但我认为这是左连接 codinghorror.com/blog/2007/10/… 的情况
-
如果您将 A_B 中的记录从 2,4 更改为 2,2,您的示例会更清晰。然后指出尽管匹配了一个值,但不应返回表 A 中的记录 2(因为它与另一个值不匹配)。
标签: java sql criteria contains criteria-api