API критериев JPA - сопоставление со списком в Spring данных JPA Технические характеристики
Я хочу создать спецификацию, которая соответствует идентификатору группы объекта пользователя, в отношении списка идентификаторов. Я думал об использовании 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);
}
};
}
Если я выключен, как бы я сделал это иначе?
Ответы
Ответ 1
Вы хотите создать спецификацию, которая соответствует всем пользователям с идентификатором группы, которые находятся в списке 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);
}
};
}
Ответ 2
путь ламба
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);
};
}