gav*_*koa 5 hibernate jpa jpql spring-data spring-data-jpa
在注释内部org.springframework.data.jpa.repository.@Query,我检查集合中的字段是否存在,如果集合为空,则可能忽略集合:
@Query(""select e from #{#entityName} where e.type in :lst or 0 = :lstSize")
List<Entity> findByLst(@Param("lst") List<XEnum> lst, @Param("lstSize") int lstSize);
Run Code Online (Sandbox Code Playgroud)
我将代码称为:
List<XEnum> lst = ...;
int lstSize = (lst == null) ? 0 : lst.size();
findByLst(lst, lstSize);
Run Code Online (Sandbox Code Playgroud)
对于 Oracle DB 在 Hibernate 记录的情况下lst = null:
DEBUG [nio-8443-exec-4] org.hibernate.SQL
entity0_.type in (?) or 0=?
TRACE [nio-8443-exec-4] org.hibernate.type.EnumType
Binding null to parameter: [1]
TRACE [nio-8443-exec-4] org.hibernate.type.descriptor.sql.BasicBinder
binding parameter [2] as [INTEGER] - [0]
Run Code Online (Sandbox Code Playgroud)
对于 Hibernate 记录的情况lst = new LinkedList<>():
DEBUG [nio-8443-exec-5] org.hibernate.SQL
entity0_.type in ( ) or 0=?
TRACE [nio-8443-exec-5] org.hibernate.type.descriptor.sql.BasicBinder
binding parameter [1] as [INTEGER] - [0]
ERROR [nio-8443-exec-5] org.hibernate.engine.jdbc.spi.SqlExceptionHelper
ORA-00936: missing expression
Run Code Online (Sandbox Code Playgroud)
在 SQL*PLUS 中它在语法上也是无效的:
select 1 from dual where 1 in ();
Run Code Online (Sandbox Code Playgroud)
我可以省略lstSize并仍然检查是否未提供集合 - 返回所有元素吗?
如何处理空列表和Oracle()语法错误?
实际上,我有一个大型 JPQL 表达式,可以通过一次调用处理多个空参数的情况。我的目标是保持简单的方法,而不是使用if/elseCritetia 构建器编写几个专门的方法......
例如,可以通过以下方式归档忽略空参数:
... and (e.field = :fieldVal or :fieldVal is null)
Run Code Online (Sandbox Code Playgroud)
更新相关资源:
Criteria API用于救援。
您正在动态构建 SQL 查询(当您通过构建工具插件从实体生成特殊类时,可以实现类型安全)。
org.springframework.data.jpa.domain.SpecificationSpring Data 以+的形式提供便利org.springframework.data.jpa.repository.JpaSpecificationExecutor,因此查询可能如下所示:
Specification<Book> spec = (Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
...
if (CollectinUtils.isNotEmpty(ids)) {
root.get("id").in(ids);
}
}
List<Book> booksByIds = repository.findAll(spec);
Run Code Online (Sandbox Code Playgroud)
Hibernate Criteria API 支持null或AND忽略OR该表达式,如果您将运算符构建器放入实用程序函数中,则可以方便地省略空检查IN。
| 归档时间: |
|
| 查看次数: |
8423 次 |
| 最近记录: |