java - 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 表达式的其他查询经常发生,但并非总是如此。
我设法通过切换条件位置来解决问题,但这很烦人,我似乎找不到模式。否则,它看起来就像一个非常奇怪的错误。
有谁知道可能会发生什么?
解决方案
推荐阅读
- java - 在 graphql-spqr 中以 Double 值对 NaN 建模
- npm - 从代理后面登录的无服务器框架?
- php - 限制表的行一次由一个脚本使用
- android - 如何在 react-native 上定制标记图?(RN-vs:0.59)
- elasticsearch - 使用 Elasticsearch 从嵌套对象中过滤多个字段
- java - Android Studio 应用仅显示白色背景和标题
- angular - 来自 Angular 外部的变更检测和事件
- python - 无法使用 PIL 库创建屏幕录制的视频输出文件
- mysql - 使用单个插入查询将相同的项目插入三个表中
- tsql - RowNumber 在每次执行后返回不同的结果