Ошибка гибернации (запрос JPA + выражение SpEL): org.hibernate.QueryException: именованный параметр не привязан - PullRequest
0 голосов
/ 08 января 2020

Я использую 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, но не всегда.

У меня есть удалось исправить проблему, поменяв местами условия, но это довольно утомительно, и я не могу найти шаблон. В противном случае это просто выглядит как очень странная ошибка.

Кто-нибудь знает, что может происходить?

...