Java 如何使用Spring数据JPA嵌套查询?
如何将以下SQL转换为标准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
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有多大的价值-对于这个问题来说,一个新手是否能够继续进行详细的示例?若需要一本书来回答,那个么它实际上并不是关于堆栈溢出的主题。是否只有一些指导原则可以说明代码中捕获的决策?