% Thích% Truy vấn trong JpaRepository mùa xuân


110

Tôi muốn viết một truy vấn giống như trong JpaRepositorynhưng nó không trả về bất kỳ thứ gì:

LIKE '%place%'-nó không hoạt động.

LIKE 'place' hoạt động hoàn hảo.

Đây là mã của tôi:

@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);
}

Câu trả lời:


199

Truy vấn JPA dữ liệu mùa xuân cần các ký tự "%" cũng như ký tự khoảng trắng sau like trong truy vấn của bạn, như trong

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

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

Bạn có thể muốn loại bỏ tất cả các @Querychú thích, vì nó có vẻ giống với truy vấn tiêu chuẩn (được triển khai tự động bởi proxy dữ liệu mùa xuân); tức là sử dụng dòng đơn

List<Registration> findByPlaceContaining(String place);

là đủ.


23
Cũng có thể hữu ích khi bỏ qua chữ hoa chữ thường cho một truy vấn, bằng cách sử dụng: findByPlaceIgnoreCaseContoring (String place);
ilyailya

Cũng giống như một nhận xét phụ - bạn không thể kết hợp và kết hợp%: param% với% param% bên trong cùng một truy vấn. Nếu không, ứng dụng thậm chí sẽ không khởi động.
RVP

Cảm ơn bạn. Tôi đã từng viết like '%:place%'với 'và không có kết quả nào cả, vì Hibernate tự thêm 's vào chuỗi.
Yamashiro Rion

Đây không phải là một phản ứng tốt và nó cũng có khả năng nguy hiểm. Mùa xuân đã sắp xếp điều này với ContizingIgnoreCase, hãy kiểm tra câu trả lời của tôi dưới đây.
Alexius DIAKOGIANNIS

99

Bạn thực sự không cần @Querychú thích.

Bạn chỉ có thể sử dụng những thứ sau

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Đối với tôi đây là giải pháp tốt nhất. Tôi không biết bạn có thể sử dụng Bỏ qua kết hợp với Chứa, Nó không có trong tài liệu.
Wilson Campusano

1
Còn trường hợp muốn sử dụng nhiều cột thì sao? - Tôi tin @Query()là phải, phải không? Với cách tiếp cận mà tôi sẽ phải thực hiện orđó không phải là thực sự là một giải pháp rất thích hợp cho trường hợp đó:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Bạn cũng có thể triển khai các truy vấn tương tự bằng cách sử dụng từ khóa "Chứa" được hỗ trợ bởi Spring Data JPA .

List<Registration> findByPlaceContaining(String place);

20

Đối với trường hợp của bạn, bạn có thể sử dụng trực tiếp các phương pháp JPA. Điều đó giống như dưới đây:

Chứa: select ... like%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

đây, Bỏ qua sẽ giúp bạn tìm kiếm mục mà bỏ qua trường hợp.

Sử dụng @Query trong JPQL :

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

Dưới đây là một số phương pháp liên quan:

  1. Giống findByPlaceLike

    … Nơi x.place như thế nào? 1

  2. Bắt đầu với findByPlaceStartingWith

    … Trong đó x.place như thế nào? 1 (tham số liên kết với% được nối thêm)

  3. Kết thúc với findByPlaceEndingWith

    … Trong đó x.place như thế nào? 1 (tham số liên kết với% được thêm vào trước)

  4. Chứa đựng findByPlaceContaining

    … Trong đó x.place như thế nào? 1 (tham số được giới hạn trong%)

Thông tin thêm, xem liên kết này , liên kết này này điều này

Hy vọng điều này sẽ giúp bạn :)


6

Bạn có thể có một lựa chọn thay thế là sử dụng trình giữ chỗ như:

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

4

Thử cái này.

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

Hữu ích nếu chúng tôi sử dụng something=:placeanother like %:place%truy vấn.
hong4rc

1

khi gọi funtion, tôi sử dụng: findByPlaceContaining("%" + place);

hoặc là: findByPlaceContaining(place + "%");

hoặc là: findByPlaceContaining("%" + place + "%");


1

câu trả lời chính xác sẽ là

-> `@Query (" chọn u từ Danh mục u nơi u.categoryName như%: input% ")
     Danh sách findAllByInput (@Param ("input") Đầu vào chuỗi);

0

Đã tìm thấy giải pháp mà không có @Query(thực sự tôi đã thử giải pháp nào được "chấp nhận". Tuy nhiên, nó không hoạt động).

Phải quay lại Page<Entity>thay vì List<Entity>:

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

IgnoreCase một phần rất quan trọng để đạt được điều này!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.