2012-07-24 18 views
10

he definido mi ContactDao de la siguiente manera:¿Es posible agregar comodines a los parámetros @Query?

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); 

} 

Lo anterior está funcionando perfectamente, y el SQL generado es lo que me gustaría escribir mi mismo. El problema es que me gustaría agregar comodines circundantes al parámetro :name. ¿Hay alguna buena manera de hacer esto? He echado un vistazo al documento de referencia de Spring Data JPA y no encuentro nada relacionado con wildards y @query.

Las siguientes obras de hackers, pero es un poco feo:

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

¿Alguien tiene una solución mejor?

Gracias, Muel.

+0

Una nota lateral ligeramente fuera de tema en caso de que _Spring Data_ authors estén a punto :) :) Tal vez este tipo de característica (delimitar con comodines) podría agregarse a '@ Param'; por ejemplo '@Param (value =" name ", wildcardStategy = WildcardStrategy.BOTH)'. Es cierto que he pensado muy poco, ¡así que probablemente haya fuertes argumentos en contra de eso! – Muel

+0

¿Es realmente un truco? –

Respuesta

3

Yo tampoco lo llamaría un truco, es la forma en que se define la sintaxis JPQL para exactamente estos problemas.

Sin embargo, existe una alternativa con un CriteriaBuilder/CriteriaQuery, pero tal vez lo encuentre aún más complejo (pero a cambio obtendrá seguridad de tipo de tiempo de compilación).

+0

Personalmente, no soy un gran admirador de la API de criterios. Lo encuentro más complejo que JPQL, y menos legible (¡aunque otros estarán en desacuerdo conmigo aquí!). Si bien proporciona seguridad de tipo de tiempo de compilación, no garantiza que se ejecutará bien en tiempo de ejecución. ¡Especialmente cuando usas Hibernate! La única vez que encuentro que la API de Criteria es muy útil es cuando crea consultas personalizadas basadas en la entrada del usuario (por ejemplo, un formulario de búsqueda). ¡Gracias por la respuesta! – Muel

Cuestiones relacionadas