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)の書き方は?
前もって感謝します :)