JPA JPQL вложенный оператор выбора

#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);