我对这个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使用它呢?
(答案在很大程度上下面的评论后重新编写)
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;
那么这些将是直接的递归导航。显然,相对于默认延迟加载,直到使用,因此会增加小的开销。
随着@ 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/...*/);
...