我有以下三个表,
表格1:
t1_name - PK
连接表:
t1_name - PK,FK
t2_name - PK,FK
start_date
end_date
some other data from further join table
表2:
t2_name - PK
我必须在 JSON 中查询 Table1 结果以了解以下条件,查询与“Raj”中的 t2_name 匹配的所有 t1_name 介于 start_date 为“2021-01-01”、“2021-01-25”之间。
现在我有以下设置,
select t1_name from Table1 t1 JOIN JoinTable jt JOIN Table2 t2 where (t2 in ('Raj')) and (jt.start_date between '2021-01-01' and '2021-01-25')
一旦我得到所有 t1_names 的列表,我查询 findAll(使用条件)以使用 pageable 从数据库中获取所有详细信息。
规范是这样的,
@Override
public Predicate toPredicate(final Root<Table1> root, final CriteriaQuery<?> query,
final CriteriaBuilder builder) {
Join<Object, Object> joinTable = null;
Join<Object, Object> table2 = null;
if (currentQueryIsCountRecords(query)) {
joinTable = root.join(t1_name, JoinType.INNER);
table2 = joinTable.join(t2_name, JoinType.INNER);
joinTable.join("somefield", JoinType.LEFT)
.join("somefield", JoinType.LEFT);
} else {
joinTable =
(Join<Object, Object>) root.fetch(t1_name, JoinType.INNER);
table2 =
(Join<Object, Object>) joinTable.fetch(t2_name, JoinType.INNER);
joinTable.fetch(somefield, JoinType.LEFT)
.fetch(somefield, JoinType.LEFT);
}
query.distinct(true).orderBy(pageable....);
/**
* Other where clause predicates can be defined here.
*
* Example : like, date range between, and , or conditions.
*/
Expression<String> parentExpression = root.get("t1_name");
Predicate finalPredicate = parentExpression.in(t1_names);
return builder.and(finalPredicate);
}
但结果看起来像这样,
{
"table1":{
"t1_name": "1",
"jointable": [
{
"table2":{
"t2_name": "Raj"
}
"start_date" : "2021-01-02"
},
{
"table2":{
"t2_name": "Kumar"
}
"start_date" : "2021-01-27"
}
]
}
}
但预期的结果只是,
{
"table1":{
"t1_name": "1",
"jointable": [
{
"table2":{
"t2_name": "Raj"
}
"start_date" : "2021-01-02"
}
]
}
}
我如何使用标准查询中的第二步来归档它,如何在应用可分页时应用多个 IN 子句。