我在创建 JPA 2 查询时遇到了麻烦(实际上我正在使用 Spring Data JPA)。我有 2 个表:
-用户(id、company_id、姓名、姓氏、状态)
-用户组(id、user_id、group_id)。
用户可以(并且经常)连接到多个组。
我要做的是根据搜索表单中的过滤选项(姓名、姓氏、状态)和从登录用户(company_id、group_id)中获取的属性来获取不同的用户列表,因为我想只显示这个用户中的用户他所属的公司和集团。
我正在使用 JPA 2 和 Spring Data 中的规范/谓词/标准来执行此操作,并且我编写了以下代码:
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 (select distinct user_id from user_group where user_group.group_id in (1, 2, 3)))
and (
upper(user0_.name) like '%'
)
and (
upper(user0_.surname) like '%'
)
and upper(user0_.status)='A' )
where
rownum <= 15
代码的粗体部分实际上并不存在,这是我的主要问题。如何编写表达式(谓词)将这部分 SQL 合并到查询中?
提前致谢 :)