java - JPA 标准生成仅包含一个问题点的查询

标签 java jpa-2.0 hibernate-criteria

在我们的数据库中,我们有缓存系统,什么对查询绑定(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/

相关文章:

java - 就地复制位图会泄漏内存吗?

java - @ManyToMany 没有连接表(遗留数据库)

java - Hibernate:如何使用 Criteria Interface 检索最后 N 个条目?

java - Hibernate:如何将多个连接表映射到Java对象(用户的书籍列表)

java - Hibernate 条件 - 内部连接或条件

java - 静态函数和非静态函数中 'Object obj = new Object()'和 'Object obj = null'的区别

java - 解决java "Constructor call must be the first statement in a constructor"

java - JEE7 : best way to create another thread that never exits

java - 如何使用 JPA2 持久化包含用户类型字段的实体

java - 控制延迟(或急切)加载的内容