Trong một dự án web, sử dụng dữ liệu mùa xuân mới nhất (1.10.2) với cơ sở dữ liệu MySQL 5.6, tôi đang cố gắng sử dụng truy vấn gốc với phân trang nhưng tôi gặp phải lỗi org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
khi khởi động.
CẬP NHẬT : 20180306 Sự cố này hiện đã được khắc phục trong Spring 2.0.4 Đối với những người vẫn quan tâm hoặc gặp khó khăn với các phiên bản cũ hơn, hãy kiểm tra các câu trả lời và nhận xét liên quan để biết cách giải quyết.
Theo Ví dụ 50 tại Sử dụng @Query từ tài liệu spring-data, có thể chỉ định chính truy vấn và countQuery, như sau:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
Vì tò mò, Trong NativeJpaQuery
lớp, tôi có thể thấy rằng nó chứa đoạn mã sau để kiểm tra xem đó có phải là một truy vấn jpa hợp lệ hay không:
public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
super(method, em, queryString, evaluationContextProvider, parser);
JpaParameters parameters = method.getParameters();
boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
boolean containsPageableOrSortInQueryExpression = queryString.contains("#pageable") || queryString.contains("#sort");
if(hasPagingOrSortingParameter && !containsPageableOrSortInQueryExpression) {
throw new InvalidJpaQueryMethodException("Cannot use native queries with dynamic sorting and/or pagination in method " + method);
}
}
Truy vấn của tôi có chứa một Pageable
tham số, vì vậy hasPagingOrSortingParameter
là true
, nhưng nó cũng đang tìm kiếm một #pageable
hoặc #sort
chuỗi bên trong queryString
, mà tôi không cung cấp.
Tôi đã thử thêm #pageable
(đó là một nhận xét) vào cuối truy vấn của mình, điều này làm cho quá trình xác thực được thông qua nhưng sau đó, nó không thực hiện được khi nói rằng truy vấn cần một tham số bổ sung: 3 thay vì 2.
Điều buồn cười là, nếu tôi tự thay đổi containsPageableOrSortInQueryExpression
từ false
để true
khi chạy, truy vấn hoạt động tốt vì vậy tôi không biết tại sao nó kiểm tra các chuỗi có mặt tại của tôi queryString
và tôi không biết làm thế nào để cung cấp nó.
Bất kì sự trợ giúp nào đều được đánh giá cao.
Cập nhật ngày 30/01/2018 Có vẻ như các nhà phát triển tại dự án dữ liệu mùa xuân đang làm việc để khắc phục sự cố này với PR của Jens Schauder