重写SQL查询在JPA JOINS

问题描述 投票:5回答:2

我对这个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 spring-data-jpa jpa-2.0
2个回答
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
投票

随着@ 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/...*/);
...
© www.soinside.com 2019 - 2024. All rights reserved.