我有这个用于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
https://www.db-fiddle.com/f/jKJodfVfvw65aMaVDyFySd/0
如何在HQL查询中实现此查询?我想在JPA中使用它吗?
答案 0 :(得分:5)
(答案在下面的评论后很大程度上进行了重写)
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;
然后,这些将很容易进行递归导航。显然,该关系默认为延迟加载,因此在使用之前几乎不会增加开销。
答案 1 :(得分:1)
在spring-data中使用@ 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/...*/);
...