1

我在创建 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 合并到查询中?

提前致谢 :)

4

0 回答 0