为了账号安全,请及时绑定邮箱和手机立即绑定

JPA 标准产生一个只有一个问题点的查询

JPA 标准产生一个只有一个问题点的查询

慕容森 2023-05-10 14:10:14
在我们的数据库中,我们有缓存系统,它对查询绑定参数敏感。我有以下查询创建:@Overridepublic 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=22and managerspo1_.is_direct=?我必须发送带有 2 个绑定参数的请求,例如:where managerspo1_.manager_id=?and managerspo1_.is_direct=?如何解决第一个“?”的问题?
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

我还没有找到解决问题的方法,我的决定是在没有规范的情况下使用实体管理器“手动创建”查询。


final String queryString = "select distinct pos from Position pos " +

            "inner join pos.managersPositions mn " +

            "where mn.managerId = :managerId and mn.isDirect = :isDirect ";


    TypedQuery<Position> query = entityManager.createQuery(

            queryString,

            Position.class);

    query.setParameter("managerId", managerEmployeeId);

    query.setParameter("isDirect", true);

因为当我制作它时criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));,它只制作了一个带有一个参数的谓词。


还尝试将规格分为 2,结果不成功:


Specification.where(firstSpecification).and(secondSpecification)


查看完整回答
反对 回复 2023-05-10
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

使用 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);


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 266 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信