1

条件ビルダーに結合を使用して 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 する方法は何ですか?

4

1 に答える 1

1

いいえ、それを行う方法はありません。JPA 2.0 は、ON 句を使用した結合をサポートしていません。おそらくそれはJPA 2.1の一部になるでしょう。

于 2012-10-18T18:58:34.057 に答える