2012-07-24 26 views
10

tôi đã xác định ContactDao của tôi như sau:Có thể thêm ký tự đại diện vào tham số @Query không?

public interface ContactDao extends JpaRepository<Contact, Long> { 

    /** 
    * Finds all contacts that the given user has entered where the contact's full name matches {@code name}. 
    * @param userId The current user's LDAP id. 
    * @param name The name to search for. 
    * @return A list of contacts matching the specified criteria. 
    */ 
    @Query(" select c from Form as f" + 
      " inner join f.contacts as c" + 
      " where f.requestorUserId = :userId" + 
      " and lower(c.fullName) like lower(:name)" + 
      " order by lower(c.fullName)") 
    List<Contact> findUserContactsByUserIdAndName(@Param("userId") String userId, @Param("name") String name); 

} 

Trên đây đang làm việc một cách hoàn hảo, và SQL được tạo ra là những gì tôi muốn viết bản thân mình. Vấn đề là tôi muốn thêm các thẻ hoang dã xung quanh vào tham số :name. Có cách nào tốt đẹp để làm điều này? Tôi đã xem tài liệu tham khảo dữ liệu mùa xuân JPA và tôi không thể tìm thấy bất cứ điều gì liên quan đến hoang dã và @query.

Các công trình Hack sau, nhưng là một chút xấu xí:

and lower(c.fullName) like '%' || lower(:name) || '%' 

Có ai có một giải pháp tốt hơn?

Cảm ơn, Muel.

+0

Một lưu ý nhỏ bên ngoài chủ đề trong trường hợp bất kỳ tác giả _Spring Data_ nào về .. :) Có lẽ loại tính năng này (có ký tự đại diện) có thể được thêm vào '@ Param'; ví dụ '@Param (giá trị =" tên ", wildcardStategy = WildcardStrategy.BOTH)'. Phải thừa nhận rằng, tôi đã đưa ra suy nghĩ này rất ít, vì vậy có lẽ có những tranh luận mạnh mẽ chống lại nó! – Muel

+0

Đó thực sự là một hack? –

Trả lời

3

Tôi cũng sẽ không gọi nó là hack - đó là cách cú pháp JPQL được xác định cho chính xác những vấn đề này.

Tuy nhiên, có một cách thay thế bằng cách sử dụng CriteriaBuilder/CriteriaQuery, nhưng có thể bạn thấy nó phức tạp hơn (nhưng bạn nhận được sự an toàn kiểu biên dịch theo thời gian).

+0

Cá nhân, tôi không phải là người hâm mộ lớn của API tiêu chí. Tôi thấy nó phức tạp hơn JPQL, và ít dễ đọc hơn (mặc dù những người khác sẽ không đồng ý với tôi ở đây!). Mặc dù nó cung cấp tính an toàn kiểu thời gian biên dịch, nó không đảm bảo nó sẽ thực thi độc đáo trong thời gian chạy. Đặc biệt khi sử dụng Hibernate! Một lần mà tôi tìm thấy API tiêu chí rất hữu ích là khi tạo truy vấn tùy chỉnh dựa trên đầu vào của người dùng (ví dụ: biểu mẫu tìm kiếm). Cảm ơn câu trả lời! – Muel

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