Java @Hrishi:为什么要避免它们?我认为联接表比嵌套在selectasfields中的子查询更优化,因为selectasfields中的子查询执行的次数与父查询获取的记录数相同。@Hrishi:嗯,是否要以分层形式从数据库中转储整个数据集?在这种情况下,是
Java @Hrishi:为什么要避免它们?我认为联接表比嵌套在selectasfields中的子查询更优化,因为selectasfields中的子查询执行的次数与父查询获取的记录数相同。@Hrishi:嗯,是否要以分层形式从数据库中转储整个数据集?在这种情况下,是,java,sql,spring,jooq,jooq-codegen-maven,Java,Sql,Spring,Jooq,Jooq Codegen Maven,@Hrishi:为什么要避免它们?我认为联接表比嵌套在selectasfields中的子查询更优化,因为selectasfields中的子查询执行的次数与父查询获取的记录数相同。@Hrishi:嗯,是否要以分层形式从数据库中转储整个数据集?在这种情况下,是的,散列联接(O(N))将优于嵌套聚合(O(A*logb*logc*logd*loge),最好是多项式,也就是说,最坏的情况下是O(N^5),尽管可能性不大)。根据数据集的大小,特别是根据每个嵌套集合的子集大小,它可能仍然可以。但是,如果您仅为
@Hrishi:为什么要避免它们?我认为联接表比嵌套在
select
asfields
中的子查询更优化,因为select
asfields
中的子查询执行的次数与父查询获取的记录数相同。@Hrishi:嗯,是否要以分层形式从数据库中转储整个数据集?在这种情况下,是的,散列联接(O(N)
)将优于嵌套聚合(O(A*logb*logc*logd*loge)
,最好是多项式,也就是说,最坏的情况下是O(N^5)
,尽管可能性不大)。根据数据集的大小,特别是根据每个嵌套集合的子集大小,它可能仍然可以。但是,如果您仅为一个小数据集获取此数据(例如,在顶层使用a
上的一些过滤器),那么您就可以了(无论如何,您都会得到嵌套的循环联接)。正确,对于小数据集,它可以正常工作。我不打算转储整个数据集。它将在前两个级别获取单个记录,但从第三个级别,它可能在第三个级别上为50-100,在第四个和第五个级别上为第三个级别上的每个记录获取相同的记录。感谢您的解决方案!
// Here are response Pojo's
Class APojo {
public string name;
public List<BPojo> listOfB;
}
Class BPojo {
public string name;
public List<CPojo> listOfC;
}
Class CPojo {
public string name;
public List<DPojo> listOfD;
}
Class DPojo {
public string name;
public List<EPojo> listOfE;
}
Class EPojo {
public string name;
}
{
"name":"A1",
"list_of_b":[
{
"name":"A1B1",
"list_of_c":[
{
"name":"A1B1C1",
"list_of_d":[
{
"name":"A1B1C1D1",
"list_of_e":[
{
"name":"A1B1C1D1E1"
},
{
"name":"A1B1C1D1E2"
}
]
},
{
"name":"A1B1C1D2",
"list_of_e":[
{
"name":"A1B1C1D2E1"
},
{
"name":"A1B1C1D2E2"
}
]
}
]
},
{
"name":"A1B1C2",
"list_of_d":[
{
"name":"A1B1C2D1",
"list_of_e":[
{
"name":"A1B1C2D1E1"
},
{
"name":"A1B1C2D1E2"
}
]
},
{
"name":"A1B1C2D2",
"list_of_e":[
{
"name":"A1B1C2D2E1"
},
{
"name":"A1B1C2D2E2"
}
]
}
]
}
]
},
{
"name":"A1B2",
"list_of_c":[
{
"name":"A1B2C1",
"list_of_d":[
{
"name":"A1B2C1D1",
"list_of_e":[
{
"name":"A1B1C1D1"
},
{
"name":"A1B1C1D2"
}
]
},
{
"name":"A1B2C1D2",
"list_of_e":[
{
"name":"A1B1C1D1"
},
{
"name":"A1B1C1D2"
}
]
}
]
},
{
"name":"A1B2C2",
"list_of_d":[
{
"name":"A1B2C2D1",
"list_of_e":[
{
"name":"A1B1C1D1"
},
{
"name":"A1B1C1D2"
}
]
},
{
"name":"A1B2C2D2",
"list_of_e":[
{
"name":"A1B1C1D1"
},
{
"name":"A1B1C1D2"
}
]
}
]
}
]
}
]
}
using(configuration()).select(A.fields())
.select(B.fields())
.select(C.fields())
.select(D.fields())
.select(E.fields())
.from(A)
.join(B).on(A.ID.eq(B.A_ID)
.join(C).on(B.ID.eq(C.B_ID)
.join(D).on(C.ID.eq(D.C_ID)
.join(E).on(D.ID.eq(E.D_ID)
.fetchGroups(
r -> r.into(A).into(APojo.class),
r -> r.into(B).into(BPojo.class),
r -> r.into(C).into(CPojo.class),
r -> r.into(D).into(DPojo.class),
r -> r.into(E).into(EPojo.class)
);
using(configuration()).select(A.fields())
.select(B.fields())
.select(C.fields())
.select(D.fields())
.select(E.fields())
.from(A)
.join(B).on(A.ID.eq(B.A_ID)
.join(C).on(B.ID.eq(C.B_ID)
.join(D).on(C.ID.eq(D.C_ID)
.join(E).on(D.ID.eq(E.D_ID)
.collect(Collectors.groupingBy(
r -> r.into(A).into(APojo.class),
Collectors.toMap(
r -> r.into(B).into(BPojo.class),
r -> r.into(C).into(CPojo.class)
r -> r.into(D).into(DPojo.class)
r -> r.into(E).into(EPojo.class)
)));