Spring JPA Repositry Query создание с LIKE IN - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь создать метод в CrudRepository, который сможет дать мне пользователя с JobType, подобным одному из них, в моем Списке JobTypes. Это должно быть что-то вроде
select * from User where JobType like '%oneOfThejobTypesInMyList%';

Я пытаюсь сделать следующее, но это не сработает:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

  List<User> findByJobTypeLikeIn(List<String> jobType);

}

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 16 января 2020

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))
...