Truy vấn phân biệt chữ hoa chữ thường với Spring CrudRepository


102

Với Spring CrudRepository Query; Tôi muốn chọn các thực thể "DeviceType" có thuộc tính "name". Nhưng sau khi truy vấn chọn các quyền theo cách phân biệt chữ hoa chữ thường. Làm thế nào tôi làm cho nó không phân biệt chữ hoa chữ thường. Cảm ơn.

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContaining(String name);

}  

16
Bạn đã thử public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);?
Peter Keller

Trong trường hợp nếu bạn quan tâm đến Truy vấn thì hãy thử cách này, Không cần đưa '%' sau khi LIKE <code> @Query (value = "select dt from DeviceType as dt where low (dt.name) like low (: name)" ) public Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

Câu trả lời:


197

Chính xác như @Peter đã đề cập trong nhận xét, chỉ cần thêm IgnoreCase:

public interface DeviceTypeRepository 
    extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContainingIgnoreCase(String name);
}  

Xem tài liệu để biết danh sách tất cả các từ khóa được hỗ trợ bên trong tên phương pháp.


Cảm ơn rất nhiều cho câu trả lời; chắc chắn tôi sẽ tham khảo tài liệu đó. Có thể cảm ơn. Chúc bạn có thời gian vui vẻ!
Channa

3
Nó đã làm việc cho tôi. Tôi đang sử dụng truy vấn JPA. Vì vậy, theo tài liệu, nơi UPPER (x.firstame) = UPPER (? 1) hoạt động.
sunitha

@sunitha bạn có biết cách nào để chúng tôi có thể sửa đổi hành vi này không, chẳng hạn như làm cho nó THẤP HƠN? Db của tôi đã lập chỉ mục dựa trên chữ thường
Sudip Bhandari

@SudipBhandari: Chắc chắn rồi.
sunitha

1
Đối với nhiều thuộc tính, hãy đọc lại IgnoreCasenhư thế này:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
Tarator

11

Truy vấn mongo dữ liệu Spring sau đây phù hợp với tôi. Tôi muốn sử dụng Listthay vìIterator

public interface DeviceTypeRepository extends CrudRepository<DeviceType,Integer>, JpaSpecificationExecutor<DeviceType> {
    List<DeviceType> findByNameIgnoreCase(String name);
} 

1

Trong trường hợp của tôi, việc thêm IgnoreCasekhông hoạt động.

Tôi nhận thấy rằng cũng có thể cung cấp các tùy chọn cho biểu thức chính quy:

@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);

Các itùy chọn làm cho các truy vấn case-insensitive.


1

Đối với những người sử dụng truy vấn JPA tùy chỉnh, từ khóa UppertoUpperCase sẽ giúp ích. Đoạn mã sau phù hợp với tôi

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();

1
Hãy cẩn thận khi sử dụng 'upper (q.applicant)'. Trong Postgres nó gây ra '.PSQLException: ERROR: chức năng trên (bytea) không tồn tại' khi q.applicant là null
advortsov
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.