首页 > 解决方案 > Hibernate 错误(JPA 查询 + SpEL 表达式):org.hibernate.QueryException:未绑定命名参数

问题描述

我正在使用 Spring 4。

按照这些 SpEL 示例,我设法使用运行良好的 SpEL 表达式构建了一些查询。

但是我不断收到这个查询和类似查询的 Hibernate 错误:

@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:命名参数未绑定:__$synthetic$__2; 嵌套异常是 org.hibernate.QueryException:命名参数未绑定:__$synthetic$__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 表达式的其他查询经常发生,但并非总是如此。

我设法通过切换条件位置来解决问题,但这很烦人,我似乎找不到模式。否则,它看起来就像一个非常奇怪的错误。

有谁知道可能会发生什么?

标签: javaspringhibernatespring-el

解决方案


推荐阅读