Мой запрос Java Spring JPA не возвращает то, что возвращает эквивалентный запрос MySQL - PullRequest
0 голосов
/ 13 июля 2020

Я использую Java Spring для веб-службы, над которой я работаю. Есть запрос, с которым у меня возникли проблемы с работой.

В MySQL Workbench этот запрос работает нормально:

SELECT * from Employees e
WHERE e.personnel_type like 'Full Time'
AND e.branch like '%%'
AND e.office like '%%'

Обратите внимание на branch и office пустые, не поставляются.

Если я запустил этот запрос в MySQL, я получу всех сотрудников, которые работают «полный рабочий день», независимо от branch или office.

Однако в моем запросе JPA:

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
    @Query("
    FROM Employees e
    WHERE e.personnelType like :personnelType
    AND e.branch like %:branch%
    AND e.officelike %:office%
    ");
    List<Object[]> employeeSearch(
        @Param("personnelType") String personnelType,
        @Param("branch") String branch,
        @Param("office") String office
    );

Если я не предоставлю branch или office, я ничего не получу; похоже, что подстановочный знак %% не работает.

Однако, если я поставлю branch и office, я получу записи, которые должен.

Что я делаете неправильно?

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Первое изменение / оптимизация MySQL запрос к этому

SELECT * от сотрудников e WHERE e.personnel_type = 'Full Time'

он вернет тот же результат, что и тот, который вы написали

  • зачем использовать например , если вы не будете использовать подстановочные знаки
  • зачем использовать например '%' , если вы не будете использовать подобный критерий в этом столбце, он «по умолчанию» получит их все, потому что вы не указали для них никаких ограничений

Итак, после изменения запроса на

SELECT * от сотрудников e WHERE e.personnel_type = 'Full Time'

ваш запрос будет работать намного быстрее, и вы сможете написать метод вместо написания JPA Запрос. И этот метод будет выглядеть просто так:

Список findAllEmployeesByName (String name)

** ПРИМЕЧАНИЕ: ** Я также предполагаю, что ваша персистентность плохо сконструирована из-за типа Object [] для Employees Сущность. Я бы посоветовал вам переосмыслить это.

0 голосов
/ 13 июля 2020

Если вы сделаете следующее, вы также можете передать null, и он будет работать

    FROM Employees e
    WHERE e.personnelType like :personnelType
    AND (:branch is null OR e.branch like %:branch%)
    AND (:office is null OR e.officelike %:office%)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...