1

JPA 2 クエリの作成に問題があります (実際には Spring Data JPA を使用しています)。私は 2 つのテーブルを持っています:
- ユーザー (id,company_id,name,surname,status)
- UsersGroup (id,user_id,group_id)。
ユーザーは、複数のグループに接続できます (多くの場合、接続されています)。

私がやろうとしているのは、検索フォームからのフィルタリング オプション (名前、姓、ステータス) と、ログに記録されたユーザーから取得した属性 (company_id、group_id) に従って、ユーザーの個別のリストを取得することです。所属している会社・団体。

JPA 2 と Spring Data の Specification/Predicate/Criteria を使用してこれを行い、次のコードを書きました。

public static Specification<User> filteredList(final ListFilterBean searchFilter, final LoggedUserBean loggedUser) {
    return new Specification<User>() {

        @Override
        public Predicate toPredicate(Root<User> root,
                CriteriaQuery<?> query, CriteriaBuilder cb) {

            List<Predicate> predicates = new ArrayList<Predicate>();

            root.join("userGroups");

            predicates.add(cb.equal(root.<Long>get(User_.companyId), loggedUser.getCompanyId()));
            predicates.add(cb.like(cb.upper(root.<String>get(User_.name)), getLikePattern(searchFilter.getName())));
            predicates.add(cb.like(cb.upper(root.<String>get(User_.surname)), getLikePattern(searchFilter.getSurname())));
            predicates.add(cb.equal(cb.upper(root.<String>get(User_.status)), searchFilter.getStatusId().charAt(0)));

            query.distinct(true);

            return cb.and(predicates.toArray(new Predicate[0]));
        }
    };
}

以下のSQLが生成されます。

select
    * 
from
    ( select
        distinct user0_.id as id5_,
        user0_.name as name5_,
        user0_.surname as surname5_
    from
        users user0_ 
    inner join
        user_group usergroup1_ 
            on user0_.id=usergroup1_.user_id 
    where
        user0_.company_id=1

および ( user0_.id in ((1, 2, 3) の user_group.group_id の user_group から個別の user_id を選択) )

        and (
            upper(user0_.name) like '%'
        ) 
        and (
            upper(user0_.surname) like '%'
        ) 
        and upper(user0_.status)='A' ) 
where
    rownum <= 15

コードの太字部分は実際には存在しない部分であり、これが私の主な質問です。SQLのこの部分をクエリに組み込む式(Predicate)の書き方は?

前もって感謝します :)

4

0 に答える 0