web-dev-qa-db-ja.com

JPA基準API-Spring Data JPA仕様のリストに対するマッチング

ユーザーオブジェクトのグループ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);
    }
  };
}

オフの場合、それ以外の場合はどうすればよいですか?

22
levtatarov

GroupsIdsリストにあるグループIDを持つすべてのユーザーに一致する仕様を作成しますか?

その場合は、次のようなものを使用できます(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);
        }
    };
}
37
rchukh

アンダースコアクラスを生成する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);
        };
    }
1
Abazad