25

我想创建一个将用户对象的组 id 与 id 列表匹配的规范。我正在考虑使用 isMember (就像在代码中一样),但该方法不会占用列表。

public static Specification<User> matchCompanyIdsList(final List<Long> groupIds){
  return new Specification<User>() {
    public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder){
      final Path<Group> group = root.<Group> get("group");
      return builder.isMember(company.<Long>get("id"), companyIds);
    }
  };
}

如果我离开了,否则我该怎么办?

4

2 回答 2

45

您是否要创建一个规范来匹配所有具有组 ID 的用户,这些用户位于 groupsIds 列表中?

如果是这样,你可以使用这样的东西(这将使用 SQL IN 子句):

public static Specification<User> matchCompanyIdsList(final List<Long> groupIds){
    return new Specification<User>() {
        public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder){
            final Path<Group> group = root.<Group> get("group");
            return group.in(groupIds);
        }
    };
}
于 2012-12-19T08:57:41.940 回答
3

使用 org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 生成下划线类的 Lamba 方式

    static Specification<User> hasRoles(List<String> roles) {
        return (root, query, cb) -> { 
            query.distinct(true);
             Join<User, Account> joinUserAccount = root.join(User_.account);
             Join<Account, AccountRole> acctRolesJoin = joinUserAccount.join(Account_.accountRoles);
             Join<AccountRole, Role> rolesJoin = acctRolesJoin.join(AccountRole_.role);

             return rolesJoin.get(Role_.name).in(roles);
        };
    }
于 2019-06-21T20:49:07.100 回答