2015-09-22 31 views
14

Tôi muốn viết một số phương thức truy vấn trong lớp kho lưu trữ. Phương thức này phải bỏ qua các tham số null. Ví dụ:Thông số tùy chọn dữ liệu mùa xuân trong phương thức truy vấn

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam); 

Phương pháp này phải được trở Foo bởi tình trạng này:

bar == barParam && goo == gooParam; 

nếu gooParam không null. nếu gooParam là null thì điều kiện thay đổi thành:

bar == barParam; 

Có giải pháp nào không? Ai đó có thể giúp tôi?

+2

Chính xác bạn đang nói về điều gì? –

+0

Danh sách findByBarAndGoo (Thanh bar, @optional Goo goo) {if (bar == null || goo == null) {ném new IllegalArgumentException ("Parametres không thể null");}} – erhun

+0

Ý tôi là trong tham số tùy chọn nếu Param này là null sau đó phương thức truy vấn IGNORE param này. Cảm ơn. –

Trả lời

-2

Bạn có thể mã hóa này mình chỉ trong một vài dòng:

List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) { 
    return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo); 
} 

Nếu không, tôi không biết nếu mùa xuân-Data hỗ trợ ra này của hộp.

8

Tôi không tin rằng bạn sẽ có thể làm điều đó với phương pháp tiếp cận tên phương pháp để định nghĩa truy vấn. Từ các tài liệu (reference):

Mặc dù nhận được một truy vấn bắt nguồn từ tên phương pháp khá thuận tiện, người ta có thể đối mặt với những tình huống trong đó một trong hai phương pháp tên phân tích cú pháp không hỗ trợ một từ khóa muốn sử dụng hoặc phương pháp tên sẽ nhận được không cần thiết xấu xí. Vì vậy, bạn có thể sử dụng JPA tên truy vấn thông qua một quy ước đặt tên (xem Sử dụng JPA NamedQueries cho biết thêm thông tin) hay đúng hơn là chú thích phương pháp truy vấn của bạn với @Query

Tôi nghĩ rằng bạn có hoàn cảnh đó đây, vì vậy câu trả lời dưới đây sử dụng phương pháp chú thích @Query, phương pháp này gần như thuận tiện như cách tiếp cận tên phương thức (reference).

@Query("select foo from Foo foo where foo.bar = :bar and " 
     + "(:goo is null or foo.goo = :goo)") 
    public List<Foo> findByBarAndOptionalGoo(
     @Param("bar") Bar bar, 
     @Param("goo") Goo goo); 
Các vấn đề liên quan