Перепишите SQL-запрос с помощью JOINS в JPA - PullRequest
0 голосов
/ 30 января 2019

У меня есть этот SQL-запрос для MariaDB.

select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE unique_id = 55544)tmp
where reference_id=@ref

https://www.db -fiddle.com / f / jKJodfVfvw65aMaVDyFySd / 0

Как этот запрос может бытьреализован в HQL-запросе?Я хотел бы использовать его в JPA?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

С @ df778899 в MyTable в весенних данных это может выглядеть так:

@Repository
public interface MyRepository extends ...

   @Query("select @ref:=id as id, unique_id, reference_id "+
           "from mytable join (select @ref:=id from mytable WHERE unique_id = :pUid) tmp "+
           "where reference_id=@ref", //just copy paste the query, use :pUid instead of constant...
            nativeQuery = true) // and this!
   List<MyTable> myCustomHirachicalQuery(@Param("pUid") Integer uid/*String/Long/...*/);
...
0 голосов
/ 01 февраля 2019

(Ответ в значительной степени переписан после комментариев ниже)

JPA не имеет встроенной поддержки иерархических запросов.Основной опцией является собственный запрос.

Например, с этим классом сущностей:

@Entity
public class MyTable {
    @Id
    @GeneratedValue
    private int id;

    private int uniqueId;

    @ManyToOne
    private MyTable reference;

    // ... getters and setters ...
}

Ниже приведен пример собственного иерархического SQL-запроса (фактически на всякий случай с MySQL):

    Query query = entityManager.createNativeQuery(
            "select @ref\\:=id as id, unique_id, reference_id\r\n" +
                    "from my_table\r\n" +
                    "join (select @ref\\:=?)tmp\r\n" +
                    "where reference_id=@ref",
            MyTable.class);
    query.setParameter(1, 1);
    query.getResultList();

Это была успешная цепочка ссылок.

(Другие альтернативы)

Вероятно, не так уж много других вариантовкоторый может сделать это как один запрос.Если масштабируемость не так важна, добавление обратной ссылки будет простым способом навигации по модели:

    @OneToMany(mappedBy = "reference")
    private Set<MyTable> backReferences;

В таком случае рекурсивно ориентироваться будет просто.Очевидно, что по умолчанию это отношение к отложенной загрузке, поэтому добавление будет незначительным, пока не будет использовано.

...