条件ビルダーに結合を使用して AND 条件をすぐに配置させたい (下のクエリの最初の左結合)。しかし、条件を述語に入れると、最後のwhere句にifが追加されます。
次のような出力が必要です。
選択する * から マイルストーン マイルストーン0_ 左外部結合 disc_user_milestone_watch userswatch1_ milestone0_.id=userswatch1_.milestone_id および userswatch1_.disc_user_id=2 で 左外部結合 ディスクユーザー ディスクユーザー2_ userswatch1_.discuser2_.id クロスで 加入 キャンペーン キャンペーン3_クロス 加入 部門部門4_ どこ milestone0_.campaign=campaign3_.id およびmilestone0_.department=department4_.id;
しかし、述語に条件を入れた後、最後のWHERE句でそのAND条件を取得します。現在、私はこのようになっています:
選択する * から マイルストーン マイルストーン0_ 左外部結合 disc_user_milestone_watch userswatch1_ milestone0_.id=userswatch1_.milestone_id で 左外部結合 ディスクユーザー ディスクユーザー2_ userswatch1_.discuser2_.id クロスで 加入 キャンペーン キャンペーン3_クロス 加入 部門部門4_ どこ milestone0_.campaign=campaign3_.id およびmilestone0_.department=department4_.id AND userswatch1_.disc_user_id=2;
AND条件を追加してすぐに参加する方法は何ですか?
私の現在のコードは次のようになります。
EntityManager em = Milestone.entityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UserMilestoneWatchStatus.class); ルートmilestoneRoot = criteriaQuery.from(Milestone.class); MilestonediscUserJoin = milestoneRoot.join("usersWatching", JoinType.LEFT); に参加します。 // これは、マイルストーン テーブルをユーザー テーブルに拡張するために使用されます 式 userId = milestonediscUserJoin.get("id"); // ID int currUserId = Integer.parseInt(params.get("currUserId").toString()); milestoneRoot.alias("x"); criteriaQuery.select(criteriaBuilder.construct(UserMilestoneWatchStatus.class, milestoneRoot, userId)); criteriaQuery.distinct(true); リスト述語リスト = new ArrayList(); predicatesList.add(criteriaBuilder.or(criteriaBuilder.equal(userId, currUserId), criteriaBuilder.isNull(userId))); criteriaQuery.where(criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]))).orderBy(sort);
AND 条件をすぐに追加して、 where ではなく join する方法は何ですか?