2015-05-13 23 views
17

hiểu biết của tôi là, với dữ liệu mùa xuân JPA tôi không thể có một phương pháp truy vấn để lấy tất cả các hàng, nơi một cột bằng một số phương pháp khác null nhất định và sử dụng cùng một phương pháp để lấy tất cả các hàng trong đó cột này là NULL khi tham số phương thức là null.mùa xuân và các thông số có thể được null

Điều đó có đúng không?

Vì vậy, tôi phải phân biệt này trong mã JAVA của tôi và tôi phải sử dụng một phương pháp truy vấn riêng biệt một cách rõ ràng hỏi cho các giá trị null, như trong ví dụ dưới đây?

// Query methods 
List<Something> findByParameter(Parameter parameter); 
List<Something> findByParameterIsNull(); 

... 

List<Something> result = new ArrayList<>(); 

if (parameter == null) 
    result = findByParameterIsNull(); 
else 
    result = findByParameter(parameter); 

Đó là xấu, nếu tôi có 4 thông số mà có thể là vô giá trị và sẽ phải mã 16 phương pháp truy vấn khác nhau.

+0

Rất tiếc, đây là giới hạn thực sự lớn của JPA dữ liệu mùa xuân (IMHO). –

Trả lời

10

Bạn nói đúng.

Một yêu cầu đã được thực hiện để hỗ trợ xử lý tốt hơn các thông số null. https://jira.spring.io/browse/DATAJPA-121

Trong trường hợp của bạn, tôi khuyên bạn nên viết triển khai kho và sử dụng tùy chỉnh CriteriaQuery để xử lý trường hợp của bạn.

Ngoài ra bạn có thể sử dụng @Query chú thích với cú pháp is null:

@Query("[...] where :parameter is null" 
public List<Something> getSomethingWithNullParameter(); 

EDIT

Kể từ khi dữ liệu mùa xuân JPA 2.0, mùa xuân bây giờ hỗ trợ chú thích @Nullable. Điều này có thể hữu ích để xử lý các tham số null được thông qua.

Từ documentation:

@Nullable - được sử dụng trên một tham số hoặc trả lại giá trị đó có thể là null.

+2

Tôi đã mở rộng câu trả lời: Khi sử dụng chú thích '@ Query' JPA dữ liệu Spring, bạn phải sử dụng hai phương thức truy vấn riêng biệt. Một để xử lý các giá trị null và một cho các giá trị không null. Nhưng khi sử dụng một phương thức truy vấn được phân tích bởi trình phân tích dữ liệu Spring (không có chú thích '@ Query'), có thể xử lý các giá trị null hoặc không null bằng một phương thức! –

+0

Tham số @Query ': là null' không hoạt động. Nó không thành công với một ngoại lệ, nhưng ngay cả khi nó sẽ không, SQL xử lý null như chưa biết. Vì vậy, không biết là không bằng không rõ ... Về cơ bản 'null' không bằng với' null' trong SQL. – Stef

8

Có vẻ như Query by Example có thể là những gì bạn cần.

Query by Example là một tính năng mới trong mùa xuân dữ liệu (since version Hopper, ra tháng 4 năm 2016), cho phép một để tạo ra các truy vấn năng động đơn giản với một mã như thế này

Person person = new Person();       
person.setFirstname("Dave");       

ExampleMatcher matcher = ExampleMatcher.matching()  
    .withIncludeNullValues();       

Example<Person> example = Example.of(person, matcher); 

personRepository.count(example); 
personRepository.findOne(example); 
personRepository.findAll(example); 

Phương pháp count/findOne/findAll mà phải mất một thể hiện của org.springframework.data.domain.Example dưới dạng tham số (và một số tham số cũng có tham số sắp xếp/phân trang) đến từ giao diện org.springframework.data.repository.query.QueryByExampleExecutor<T>, được mở rộng bằng giao diện org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable>.

Nói tóm lại, tất cả JpaRepository trường bây giờ có những phương pháp này.

Các vấn đề liên quan