在JPA中用JOINS重写SQL查询

时间:2019-01-30 11:02:46

标签: jpa spring-data-jpa jpa-2.0

我有这个用于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中使用它吗?

2 个答案:

答案 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/...*/);
...