休眠错误(JPA查询+ SpEL表达式):org.hibernate.QueryException:未绑定命名参数

问题描述 投票:0回答:1

我正在使用Spring 4。

跟随these SpEL examples,我设法使用了可以正常工作的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

我已经进行了一些研究,并理解the error is related to missing parameter values。因此,该错误表明缺少第二个条件中的参数,但这没有多大意义,因为相同的参数出现在第一个条件中。

奇怪的是,我观察到以下内容:

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表达式的其他查询经常发生,但并非总是如此。

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

有人对发生的事情有任何想法吗?

java spring hibernate spring-el
1个回答
0
投票

问题与Spring Data JPA的“ StringQuery”中的“ SpelExtractor”有关

前几天,我已经为春季团队创建了一个问题,等待答复。请参考DATAJPA-1683

© www.soinside.com 2019 - 2024. All rights reserved.