在JPA中使用JOINS重写SQL查询

Pet*_*zov 5 jpa jpa-2.0 spring-data-jpa

我有MariaDB的SQL查询.

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
Run Code Online (Sandbox Code Playgroud)

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

如何在HQL查询中实现此查询?我想在JPA中使用它?

df7*_*899 5

(答案大部分在下面的评论后重写)

JPA没有内置的分层查询支持.主要选项是本机查询.

例如,使用此实体类:

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

    private int uniqueId;

    @ManyToOne
    private MyTable reference;

    // ... getters and setters ...
}
Run Code Online (Sandbox Code Playgroud)

以下是本机分层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();
Run Code Online (Sandbox Code Playgroud)

这成功地追逐了一系列参考文献.

(其他替代方案)

可能没有太多其他选项可以作为单个查询执行此操作.如果可扩展性不是一个问题,添加反向引用将是导航模型的简单方法:

    @OneToMany(mappedBy = "reference")
    private Set<MyTable> backReferences;
Run Code Online (Sandbox Code Playgroud)

那些将是直接递归导航.显然,关系默认为延迟加载,因此在使用之前会增加很少的开销.