Я использую Spring 4.
После этих примеров SpEL Мне удалось построить некоторые запросы с использованием выражений SpEL, которые прекрасно работают.
Но я продолжаю получать Hibernate's ошибка с этим запросом и аналогичными:
@Query("SELECT c FROM Client c WHERE c.id LIKE CONCAT(:#{#f.id}) AND LOWER(c.contract) LIKE LOWER(CONCAT('%',:#{#f.contract}, '%'))"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
org.springframework.dao.InvalidDataAccessResourceUsageException: Именованный параметр не привязан: __ $ синтетический $ __ 2; вложенным исключением является org.hibernate.QueryException: именованный параметр не привязан: __ $ синтетический $ __ 2
Я провел некоторое исследование и понял, что ошибка связана с отсутствующими значениями параметров, Следовательно, ошибка говорит о том, что параметр во втором условии отсутствует, но это не имеет особого смысла, поскольку этот же параметр появляется в первом условии.
Любопытно, что я заметил следующее:
A) Если я удаляю второе условие из исходного запроса, окончательный запрос работает так, как задумано, без ошибок (как и ожидалось).
@Query("SELECT c FROM Client c WHERE c.id LIKE CONCAT(:#{#f.id}))"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
B) Если я удаляю первое условие из исходного запроса, последний запрос работает, как и предполагалось, без ошибок.
@Query("SELECT c FROM Client c WHERE LOWER(c.contract) LIKE LOWER(CONCAT('%',:#{#f.contract}, '%'))"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
C) Если я переключу порядок условий из исходного запроса, окончательный запрос будет работать так, как задумано, без ошибок.
@Query("SELECT c FROM Client c WHERE LOWER(c.contract) LIKE LOWER(CONCAT('%',:#{#f.contract}, '%')) AND c.id LIKE CONCAT(:#{#f.id})"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
D) Если я добавлю третье условие в исходный запрос, окончательный запрос все равно получит ту же ошибку, что и раньше.
@Query("SELECT c FROM Client c WHERE c.id LIKE CONCAT(:#{#f.id}) AND LOWER(c.contract) LIKE LOWER(CONCAT('%',:#{#f.contract}, '%')) AND c.status LIKE CONCAT(:#{#f.status})"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
Мое определение класса ClientFilter
:
public class ClientFilter {
private String id;
private String contract;
private String status;
public ClientFilter() {
super();
this.id = "%%";
this.status = "%%";
}
public ClientFilter(Long id, String contract, Status status) {
super();
this.id = id == null ? "%%" : id.toString();
this.contract = contract;
this.status = status == null ? "%%" : status.getValue().toString();
}
public String getId() {
return id;
}
public String getContract() {
return contract;
}
public String getStatus() {
return status;
}
}
Часто с другими запросами я использую выражения SpEL, но не всегда.
У меня есть удалось исправить проблему, поменяв местами условия, но это довольно утомительно, и я не могу найти шаблон. В противном случае это просто выглядит как очень странная ошибка.
Кто-нибудь знает, что может происходить?