在我们的数据库中,我们有缓存系统,什么对查询绑定(bind)参数敏感。
我创建了以下查询:
@Override
public Predicate toPredicate(Root<Position> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
query.distinct(true);
final Collection<Predicate> predicates = new ArrayList<>();
Join<Position, ManagersPositions> managersPositionsJoin = root.join("managersPositions", JoinType.INNER);
Predicate managerPredicate = criteriaBuilder.equal(managersPositionsJoin.get("managerId"), managerId);
predicates.add(managerPredicate);
if (onlyDirect) {
Predicate equalsDirect = criteriaBuilder.equal(managersPositionsJoin.get("isDirect"), true);
predicates.add(equalsDirect);
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
它会产生以下查询:
select
distinct position0_.id as id1_69_0_,
...
where managerspo1_.manager_id=22
and managerspo1_.is_direct=?
我必须发送带有 2 个绑定(bind)参数的请求,例如:
where managerspo1_.manager_id=?
and managerspo1_.is_direct=?
如何解决第一个“?”的问题?
最佳答案
使用 CriteriaBuilder.parameter() 添加多个参数:
ParameterExpression<Integer> managerIdParam =
criteriaBuilder.parameter( Integer.class );
ParameterExpression<Boolean> isDirectParam =
criteriaBuilder.parameter( Boolean.class );
Predicate managerPredicate =
criteriaBuilder.equal(managersPositionsJoin.get("managerId"),
managerIdParam);
Predicate equalsDirect =
criteriaBuilder.equal(managersPositionsJoin.get("isDirect"), isDirectParam);
关于java - JPA 标准生成仅包含一个问题点的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293316/