Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring数据JPA嵌套查询?_Java_Spring_Hibernate_Jpa_Criteria - Fatal编程技术网

Java 如何使用Spring数据JPA嵌套查询?

Java 如何使用Spring数据JPA嵌套查询?,java,spring,hibernate,jpa,criteria,Java,Spring,Hibernate,Jpa,Criteria,如何将以下SQL转换为标准 SELECT DISTINCT <column name> FROM <table> WHERE <some other column> IN (SELECT DISTINCT <column name 2> FROM <table 2> WHERE <some other column 2> IN (SELECT <column name 3> F

如何将以下SQL转换为标准

SELECT DISTINCT <column name> FROM <table>
WHERE <some other column> IN 
    (SELECT DISTINCT <column name 2> FROM <table 2> 
    WHERE <some other column 2> IN
        (SELECT <column name 3> FROM <table 3>
        WHERE <some other column 3> IN
            (SELECT <column name 4> from <table 4>
            WHERE <some other column 4> IN (0,1,2,3,4))))
以下是我将搜索的列值类型:

Column           Value Type
<column name>    String
<column name 2>  String
<column name 3>  Long
<column name 4>  Long
要翻译的SQL:

SELECT DISTNCT <column name> FROM <table>
WHERE <some other column> IN 
    (SELECT DISTINT <column name 2> FROM <table 2> 
    WHERE <some other column 2> IN
        (SELECT <column name 3> FROM <table 3>
        WHERE <some other column 3> IN
            (SELECT <column name 4> from <table 4>
            WHERE <some other column 4> IN (0,1,2,3,4))))

Column           Value Type
<column name>    String
<column name 2>  String
<column name 3>  Long
<column name 4>  Long
转换为JPA标准的SQL:

CriteriaBuilder cb = emf.getCriteriaBuilder();
CriteriaQuery<String> cqTable = cb.createQuery(String.class);
Root<table> fromTable = cqTable .from(<table>.class);

Subquery<String> cqTable2 = cqTable.subquery(String.class);
Root<table 2> fromTable2 = cqTable2.from(<table 2>.class);

Subquery<Long> cqTable3 = cqTable2.subquery(Long.class);
Root<table 3> fromTable3 = cqTable3.from(<table 3>.class);

Subquery<Long> cqTable4 = cqTable3.subquery(Long.class);
Root<table 4> fromTable4 = cqTable4.from(<table 4>.class);

    cqTable4 = cqTable4.select(fromTable4.get("column 4").as(Long.class))
.where(fromTable4.get("some other column 4").in(new ArrayList<String>(){{
                                add("0");
                                add("1");
                                add("2");
                                add("3");
                                add("4");}}));

cqTable3 = cqTable3.select(fromTable3.get("column name 3").as(Long.class))
                .where(fromTable3.get("some other column 3")
                        .in(cqTable4));

cqTable2 = cqTable2.select(fromTable2.get("column name 2").as(String.class))
                .distinct(true).where(fromTable2.get("some other column 2")
                        .in(cqTable3));

cqTable = cqTable.select(fromTable.get("column name").as(String.class))
.distinct(true).where(fromTable.get("some other column").in(cqTable2)));

List<String results = emf.createEntityManager().createQuery(cqTable ).getResultList();

我希望这能够帮助那些正在努力用nest SELECT和IN子句编写标准的人。

我相信您理解了这个问题…:但它确实问了如何去做,而这篇文章并没有回答这个问题。真正有价值的是,它应该解释思考过程和采取的步骤,以便碰巧没有完全相同的SQL的人能够遵循代码示例支持的步骤。这是正确的。这个例子和我在工作中做的事情很相似,我想和大家分享一下。一个更彻底、更受支持的回答就像一本书,因为理解标准,如果你以前从未使用过它,那么如何正确地利用它是一项艰巨的任务。理解-但是如果没有这些支持信息,q&A有多大的价值-对于这个问题来说,一个新手是否能够继续进行详细的示例?若需要一本书来回答,那个么它实际上并不是关于堆栈溢出的主题。是否只有一些指导原则可以说明代码中捕获的决策?