亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 306 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號