#java #mysql #hibernate #jpa #jpql
#java #mysql #впасть в спящий режим #jpa #jpql
Вопрос:
У меня есть очень простая таблица соединений, связанная с двумя таблицами, для упрощения проблемы мы можем сказать, что table1 — это A, а таблица 2 — это B, с таблицей соединений AB.
A | AB | B |
---|---|---|
A_id | AB_id | B_id |
A_детали | A_id_fk | B_details |
B_id_fk |
где A_id_fk и B_id_fk являются внешними ключами соответственно. Я пытаюсь создать запрос для извлечения всех строк A, которые имеют отношение к B. Итак, моя функция получает 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 ? Я не уверен, что я должен здесь делать.
Комментарии:
1.
select i from A i join i.ab ii where ii.b = :B_ID
?2. @JorgeCampos это не сработало, что вы подразумеваете под i.ab? is . открытая скобка?
3.
SELECT A_details FROM A JOIN AB ON A_id = A_id_fk WHERE B_id_fk = :B_ID
4. Подсказка для структуры
AB_id
не требуетсяAB
, может иметь(A_id_fk, B_id_fk)
в качестве объединенного первичного ключа. Исключительные обстоятельства могут диктовать иное, однако это общее правило для таблицы объединения.5. @danblack да, я пытался создать составной ключ в течение 2 дней и сдался. Если вы не возражаете, не могли бы вы написать это в формате JPQL, мне сложно перевести это в JPQL.
Ответ №1:
Основываясь на вашем запросе, я предполагаю, что вы напрямую сопоставили свои объекты ( A
с A_id
, A_details
полями, B
с B_id
, B_details
полями и AB
с AB_id
, A_id_fk
, B_id_fk
).
Я запустил тест, и ваш запрос (так, как вы его написали здесь) работает, как ожидалось.
unable to resolve z.A_id.fk
предполагает, что у вас есть опечатка в исходном коде ( A_id.fk
вместо A_id_fk
).
Если у вас другая модель, пожалуйста, укажите здесь модель ваших объектов вместе с полным исключением.
Ответ №2:
Вот что в итоге сработало:
TypedQuery<Promotions> query = em.createQuery("select i from A i inner join AB x on x.A.A_id = i.A_id where x.B.B_id = :B_id", A.class);