% Як% Запит у весняний JpaRepository


110

Я хотів би написати подібний запит, JpaRepositoryале він нічого не повертає:

LIKE '%place%'-не працює.

LIKE 'place' працює чудово.

Ось мій код:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

Відповіді:


199

Для запиту JPA для весняних даних потрібні символи "%", а також пробіл, який слід likeу вашому запиті, як у

@Query("Select c from Registration c where c.place like %:place%").

Ср. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

Можливо, ви хочете повністю позбутися від @Queryпримітки, оскільки вона, схоже, нагадує стандартний запит (автоматично реалізований проксі-серверами даних); тобто використовуючи єдиний рядок

List<Registration> findByPlaceContaining(String place);

є достатнім.


23
Може бути корисним також ігнорувати регістр запиту, використовуючи: findByPlaceIgnoreCaseContain (Місце рядка);
ilyailya

Так само як побічний коментар - ви не можете змішувати і співставляти%: param% з% param% всередині одного запиту. Інакше додаток навіть не запуститься.
RVP

Дякую. Я мав звичай писати like '%:place%'з , 'і не було ніяких результатів, так як Hibernate додає 'S в рядки сам по собі.
Ріон

Це не є гарною реакцією, і це також може бути небезпечно. Весна розібралася з ContainIgnoreCase, перегляньте мою відповідь нижче.
Олексій ДІАКОГІАННІС

99

@QueryАнотація вам взагалі не потрібна .

Ви можете просто скористатися наступним

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Для мене це найкраще рішення. Я не знав, що ви можете використовувати IgnoreCase у поєднанні з Contain, це не в документації.
Вілсон Кампусано

1
Що з випадком, коли я хочу використовувати багато стовпців? - Я вважаю @Query(), що це обов’язково, правда? При такому підході я повинен був би зробити це, orщо насправді не є найкращим рішенням для цього випадку:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Ви також можете реалізувати подібні запитам з використанням Spring Data JPA підтримується ключовим словом «Містить» .

List<Registration> findByPlaceContaining(String place);

20

Для вашого випадку ви можете безпосередньо використовувати методи JPA. Це як нижче:

Містить: виберіть ... як%: місце%

List<Registration> findByPlaceContainingIgnoreCase(String place);

тут, IgnoreCase допоможе вам шукати предмет із ігноруванням справи.

Використання @Query в JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

Ось кілька пов'язаних методів:

  1. Подібно до findByPlaceLike

    … Де x.міста на зразок? 1

  2. Починаючи з findByPlaceStartingWith

    … Де x.place типу? 1 (параметр, пов'язаний із доданим%)

  3. Закінчення З findByPlaceEndingWith

    … Де x.place, як? 1 (параметр, пов'язаний з попередньо%)

  4. Містять findByPlaceContaining

    … Де x.place, як? 1 (параметр обмеженого загорнутого у%)

Більше інформації, перегляньте це посилання , це посилання та це

Сподіваюся, це допоможе вам :)


6

Можна використовувати одну альтернативу використання заповнювачів як:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

Спробуйте це.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

Корисно, якщо ми використовуємо something=:placeі another like %:place%в запиті.
hong4rc

1

при функціонуванні дзвінка я використовую: findByPlaceContaining("%" + place);

або: findByPlaceContaining(place + "%");

або: findByPlaceContaining("%" + place + "%");


1

відповідь точно буде

-> `@Query (" виберіть u з категорії u, де u.categoryName, як%: input% ")
     Список findAllByInput (@Param ("input") Рядок введення);

0

Знайшов рішення без @Query(насправді я спробував, яке саме "прийнято". Однак, воно не вийшло).

Потрібно повернутися Page<Entity>замість List<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase частина була критичною для досягнення цього!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.