Можно ли добавить подстановочные знаки в параметры @Query?

Я определил свой ContactDao следующим образом:

public interface ContactDao extends JpaRepository<Contact, Long> {

  /**
   * Finds all contacts that the given user has entered where the contact full name matches {@code name}.
   * @param userId The current user 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);

}

Вышеизложенное работает отлично, и сгенерированный SQL - это то, что я бы написал сам. Проблема в том, что я хотел бы добавить окружающие wild-cards к параметру :name. Есть ли хороший способ сделать это? Я посмотрел справочный документ Spring Data JPA, и я не могу найти что-либо в отношении wildards и @query.

Следующий хак работает, но немного уродлив:

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

Есть ли у кого-то лучшее решение?

Спасибо, Muel.

Ответ 1

Я бы тоже не назвал это взломом - это то, как синтаксис JPQL определен именно для этих проблем.

Однако есть альтернатива, использующая CriteriaBuilder/CriteriaQuery, но, возможно, вы обнаружите ее еще более сложной (но вы получаете тип времени компиляции безопасность взамен).