JPA in 子句使用规范 - JHipster 方法
JPA in clause using Specification - JHipster approach
我有 2 个实体 A、B。A 包含一个集合,我需要在 QueryService 中按 B 的字段 X 进行过滤。
我看到谓词,但我不明白如何使用它。
StringFilter lf = new StringFilter(); lf.setEquals(value);
return (root, query, builder) -> {
Predicate p = builder.in(expression);
return builder.and(p);
};
“表情”里放了什么????获得类似的东西:
SELECT * FROM A WHERE
A.id in (select b.id_A from b where b.code_field ='alfacentauri')
谢谢!
你应该这样在 predicate 中使用 Subquery
return (root, query, builder) -> {
Subquery<Long> subquery = query.subquery(Long.class); // if b.id_A has Long type
Root<B> subRoot = subquery.from(B.class);
final Predicate codeFieldPredicate =
builder.equal(subRoot.get("code_field"), "alfacentauri");
subquery.select(subRoot.get("id_A")).where(codeFieldPredicate);
return builder.in(root.get("id")).value(subquery);
}
另一种方法是使用exists
谓词
return (root, query, builder) -> {
Subquery<Long> subquery = query.subquery(Long.class);
Root<B> subRoot = subquery.from(B.class);
final Predicate mainQueryPredicate =
builder.equal(root.get("id"), subRoot.get("id_A"));
final Predicate codeFieldPredicate =
builder.equal(subRoot.get("code_field"), "alfacentauri");
subquery.select(subRoot.get("id_A")).where(mainQueryPredicate , codeFieldPredicate);
return builder.exists(subquery);
}
它生成的查询有点不同,但结果符合预期
我有 2 个实体 A、B。A 包含一个集合,我需要在 QueryService 中按 B 的字段 X 进行过滤。
我看到谓词,但我不明白如何使用它。
StringFilter lf = new StringFilter(); lf.setEquals(value);
return (root, query, builder) -> {
Predicate p = builder.in(expression);
return builder.and(p);
};
“表情”里放了什么????获得类似的东西:
SELECT * FROM A WHERE
A.id in (select b.id_A from b where b.code_field ='alfacentauri')
谢谢!
你应该这样在 predicate 中使用 Subquery
return (root, query, builder) -> {
Subquery<Long> subquery = query.subquery(Long.class); // if b.id_A has Long type
Root<B> subRoot = subquery.from(B.class);
final Predicate codeFieldPredicate =
builder.equal(subRoot.get("code_field"), "alfacentauri");
subquery.select(subRoot.get("id_A")).where(codeFieldPredicate);
return builder.in(root.get("id")).value(subquery);
}
另一种方法是使用exists
谓词
return (root, query, builder) -> {
Subquery<Long> subquery = query.subquery(Long.class);
Root<B> subRoot = subquery.from(B.class);
final Predicate mainQueryPredicate =
builder.equal(root.get("id"), subRoot.get("id_A"));
final Predicate codeFieldPredicate =
builder.equal(subRoot.get("code_field"), "alfacentauri");
subquery.select(subRoot.get("id_A")).where(mainQueryPredicate , codeFieldPredicate);
return builder.exists(subquery);
}
它生成的查询有点不同,但结果符合预期