使用Criteria进行递归查询

时间:2016-03-09 22:10:06

标签: sql jpa criteria-api

这是我的第一篇文章,所以我希望你能帮助我找到解决问题的方法:)

我有2列,idParent和idChild。如果我想表示Parent id = 1有2个孩子(id = 2& id = 3),我们会发现:

+--------------------+
| idParent   idChild |
+--------------------+
|  1           2     |
|  1           3     |
+--------------------+

好吧,我的目标是从idChild开始,找到他所有的"顶部"父母(没有父母的父母)在一次查询中,如果可能的话。

样品:

+--------------------+
| idParent   idChild |
+--------------------+
|    1          3    |
|    2          4    |
|    2          5    |
|    3          5    |
|    3          6    |
|    5          7    |
+--------------------+

预期结果(如果我们开始使用idChild = 7查询):

+----------+
| idParent |
+----------+
|        1 |
|        2 |
+----------+

我不知道我是否可以通过单个查询解决问题。我的另一个选择是创建一个简单的查询,从父级返回父级并从我的Java代码开始多次调用它(效率低得多)。

谢谢!

注意:如果有帮助,我必须使用CriteriaQuery API来访问数据。

1 个答案:

答案 0 :(得分:0)

criteriaBuilder.withRecursive(CteName.class)
.from(EntityName.class, "tableAlias1")
.bind("idParent").select("table_name.idParent")
.bind("idChild").select("table_name.idChild")
.where("table_name.idChild").eq("7")
.union()
.from(EntityName.class, "tableAlias2")
.bind("idParent").select("table_name.idParent")
.bind("idChild").select("table_name.idChild")
.where("tableAlias2.idChild").eq("tableAlias1.idParent");

然后您可以使用生成的结果
    object.getList();