JPA Критерии
Чтобы достичь like
с in
, вы должны использовать множество like
с or
. Вы можете сделать это с Criteria
без Repository
, например:
@Autowired
EntityManager em;
private List<User> findByLikeIn(String columnName, List<String> values) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> users = cq.from(User.class);
values.stream()
.map(v -> cb.like(users.get(columnName), "%" + v + "%"))
.reduce(cb::or)
.ifPresent(cq::where);
TypedQuery<User> query = em.createQuery(cq);
return query.getResultList();
}
И затем использовать это:
List<String> jobType = Arrays.asList("aa", "dap");
List<User> resultList = findByLikeIn("jobType", jobType);
Это должно создать что-то вроде что:
select u from User u where u.jobType like '%jobType1%' or u.jobType like '%jobType2%';
Спецификация
Или вышеуказанный код, который вы можете применить в спецификации :
public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
static Specification<User> containing(String columnName, List<String> values) {
return (root, query, builder) -> values.stream()
.map(v -> builder.like(root.get(columnName), "%" + v + "%"))
.reduce(builder::or)
.orElseGet(builder::conjunction);
}
и использовать его следующим образом:
List<String> jobType = Arrays.asList("aa", "dap");
List<User> resultList = userRepository.findAll(UserRepository.containing("jobType", jobType))