我正在使用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表达式的其他查询经常发生,但并非总是如此。
我设法通过切换条件位置来解决问题,但是这很累,而且我似乎找不到任何模式。否则,它看起来就像是一个非常奇怪的错误。
有人对发生的事情有任何想法吗?
问题与Spring Data JPA的“ StringQuery”中的“ SpelExtractor”有关
前几天,我已经为春季团队创建了一个问题,等待答复。请参考DATAJPA-1683