【发布时间】:2021-04-07 09:57:19
【问题描述】:
我有一个非常简单的连接表,关联两个表,为了简化问题,我们可以说 table1 是 A,表 2 是 B,连接表 AB。
| A | AB | B |
|---|---|---|
| A_id | AB_id | B_id |
| A_details | A_id_fk | B_details |
| B_id_fk |
其中 A_id_fk 和 B_id_fk 分别是外键。我试图创建一个查询来检索与 B 有关系的 A 的所有行。所以我的函数接收 B_id 作为参数,我想搜索 AB 以获取 B_id_fk == b_id 的所有行,然后使用搜索 A A_id == 先前搜索返回的 A_id_fk 的所有行。
我测试过,它可以使用这样的嵌套选择在纯 SQL 中完成:
SELECT *
FROM A
WHERE A_ID =
(SELECT A_id_fk
from AB
where B_id_fk = B_id);
所以我阅读了 JPQL 的文档:http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_exists 并尝试了这个
@Transactional
public List<A> getA(int B_id){
TypedQuery<A> query = em.createQuery("select i from A i where i.A_id =
(select z.A_id_fk from AB z where z.B_id_fk = :B_ID)", A.class);
return query.setParameter("B_ID",B_id).getResultList();
}
我现在真的迷路了,因为我遵循了文档中给定的示例,但是它让我无法解决 z.A_id.fk 错误,是否有办法将 B.class 嵌套在 A.class 中?我不确定我应该在这里做什么。
【问题讨论】:
-
select i from A i join i.ab ii where ii.b = :B_ID? -
@JorgeCampos 它不起作用,你说的 i.ab 是什么意思?是 。一个左括号?
-
SELECT A_details FROM A JOIN AB ON A_id = A_id_fk WHERE B_id_fk = :B_ID -
不需要结构
AB_id的提示AB可以将(A_id_fk, B_id_fk)作为联合主键。特殊情况可能另有规定,但这是连接表的一般规则。 -
@danblack 是的,我尝试制作复合键 2 天并放弃了。如果你不介意你能不能把它写成 JPQL 格式,我很难把它翻译成 JPQL。
标签: java mysql hibernate jpa jpql