Java SQL/条件查询是否包含所有?

Java SQL/条件查询是否包含所有?,java,sql,criteria,contains,criteria-api,Java,Sql,Criteria,Contains,Criteria Api,现在,我想得到表A中的所有条目,其中B.id=1和B.id=2 目前,我必须执行以下代码: 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

现在,我想得到表A中的所有条目,其中B.id=1和B.id=2

目前,我必须执行以下代码:

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
我被卡住了
WHERE b.id IN(…)
给出了表A中的所有条目,其中
b.id=1或b.id=2当然是
,而
其中b.id=1和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
但是我可以有无限多个b.id。所以这个查询会变得非常慢

中是否有类似于
的东西,它的行为符合我的要求?并且应该使用条件查询来实现:

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
Join aB=root.Join(A.bs);//因为这是一种多人的关系
...

但是我也很乐意使用纯SQL解决方案。

我必须承认,我并没有真正理解这个问题和问题,但你是说这不起作用:

Join<A, B> aB = root.join(A_.bs); // as this is a @ManyToMany relationship
...

据我所知,这是一个多对多关系,您希望根据表
B
上的Id过滤数据

首先,我觉得你的第一个问题还可以;为了清楚起见,我将写如下:

SELECT *
FROM B b
LEFT JOIN A_B ab ON b.id    = ab.b_id
LEFT JOIN A a    ON ab.a_id = a.id
WHERE b.id IN (1,2)
现在,如果您想要所有
b.id=1
b.id=2
的记录,应该可以:

select 
    a.id, a.a, b.id, b.b
from 
    A as a
    inner join A_B as ab on a.id = ab.a_id
    inner join B as b on ab.b_id = b.id;
检查这个

希望这有助于在MySQL上测试:

select 
    a.id, a.a, b.id, b.b
from 
    A as a
    inner join A_B as ab on a.id = ab.a_id
    inner join B as b on ab.b_id = b.id
where
    b.id in (1,2);

.

我不确定我是否正确理解了这个问题,但我认为这是一个左连接的情况。如果将a_B中的记录从2,4更改为2,2,您的示例将更加清晰。然后指出表A中的记录2不应返回,尽管它与一个值匹配(因为它与另一个值不匹配)。请再次读取它。我用INTERSECT找到了一个解决方案。但您的查询只给出表A的结果,其中b.id=1或b.id=2。但是我想要表A中的所有条目,其中b.id=1和b.id=2。嘿,谢谢。我应该写一个SQL提琴。。。我修改了你的:(更改了A_B表中的条目)。结果现在应该只包含a.id=1,因为它是唯一匹配b.id=1和b.id=2的条目。这取决于计数。。。因此,如果A_B包含记录2,2两次,它将返回太多记录。
select TableA.id, count(*)
from tableA
join tableA_B on TableA.id=TableA_B.a_id
where b_id =1 or b_id=2
group by tableA.id
having count(*)=2