2017-05-04 15 views
9

Tôi muốn có một giao diện kho lưu trữ dữ liệu mùa xuân có hai tham số. Có cách nào để làm cho nó có hành vi sau đây không?Dữ liệu mùa xuân - bỏ qua tham số nếu nó có giá trị rỗng

MyObject findByParameterOneAndParameterTwo(String parameterOne, String parameterTwo); 

Nếu cả hai tham số đều có giá trị, tôi muốn nó hoạt động bình thường và thực hiện "AND" cho cả hai giá trị.

Nếu ví dụ tham số thứ hai là null, sau đó nó sẽ tìm kiếm chỉ bằng ParameterOne

Bất kỳ lời đề nghị?

+1

Cơ chế truy xuất tên truy vấn kho lưu trữ được cung cấp bởi Spring Data có nghĩa là trường hợp truy vấn được biết trước. Nó không phải là thực tế để mong đợi rằng cơ chế để làm việc với các truy vấn được biết chính xác chỉ khi chạy. Đối với các tình huống động, có một số tùy chọn khác như '@ Query' và QueryDSL. SQL và JPA hỗ trợ hàm 'COALESCE', có thể được sử dụng để làm việc xung quanh tham số đôi khi có giá trị' NULL'. '@Query (" SELECT e TỪ MyObject e WHERE COALESCE (e.parameterOne,? 1) =? 1 AND COALESCE (e.parameterOne,? 2) =? 2 ")' nên hoạt động. – manish

+1

@manish Tôi nghĩ rằng 'COALESCE (? 1, e.parameterOne) = e.parameterOne' là intation của bạn. – Blank

+0

@Forward, tôi đã chỉ đưa ra một hướng để áp phích như tôi không chắc chắn về cách áp phích muốn phù hợp để làm việc chính xác. Ví dụ, nó chưa được xác định cho dù cơ sở dữ liệu có thể chứa các giá trị 'null' cho các cột đó và nếu có, cách thức phù hợp với công việc, v.v. Nhưng có, chỉ dựa trên những gì đã được đăng, bình luận của bạn là tại chỗ trên. – manish

Trả lời

6

Tôi không chắc nó có thể với các phương pháp kho đặt tên, nhưng bạn có thể sử dụng @Query như

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo) 
+1

Có lẽ 'isnull' nên được thay đổi thành' is null'? – Searene

+0

@Searene, vâng, bạn nói đúng –

5

Hiện nay điều này không thể trong Spring-data-jpa.

Có một JIRAticket về vấn đề này mà vẫn còn đang được điều tra bởi nhóm Spring.

Tuy nhiên, nếu bạn muốn giải pháp khác, bạn có thể kiểm tra ví dụ truy vấn tiêu chí đơn giản here.

0

Tôi không chắc liệu có thể sử dụng Repo như một lớp riêng biệt nhưng bạn có thể sử dụng truy vấn chắp thêm StringBuilder với tham số tùy chọn. Điều này chắc chắn sẽ hoạt động

StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select p.name from personDemographic p "); 
    Boolean flag = true; 
    if(parameterOne != null){ 
     if(flag){ 
      queryBuilder.append("where condition..."); 
      flag=false; 
     } 
     } 
    if(parameterOne != null){ 
    if(flag){ 
    queryBuilder.append("where condition..."); 
    flag = false; 
    }else{ 
     queryBuilder.append("and condition..."); 
    } 
    Query query = entityManager.createQuery(queryBuilder.toString()); 
Các vấn đề liên quan