gpt4 book ai didi

hibernate - 处理 JPA 中的空或空集合参数

转载 作者:行者123 更新时间:2023-12-03 21:30:29 28 4
gpt4 key购买 nike

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);

我将代码称为:
List<XEnum> lst = ...;
int lstSize = (lst == null) ? 0 : lst.size();
findByLst(lst, lstSize);

对于 lst = null Hibernate 记录的 Oracle DB:
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]

对于 lst = new LinkedList<>() hibernate 记录的情况:
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

并且它在 SQL*PLUS 中在语法上也是无效的:
select 1 from dual where 1 in ();

我可以省略 lstSize 并仍然检查是否未提供集合 - 返回所有元素吗?

如何处理空列表和 Oracle () 语法错误?

实际上,我有一个很大的 JPQL 表达式,可以通过单个调用处理几种空参数的情况。我的目标是使用 if/else 或 Critetia builder 来保持简单的方法而不是编写几个专门的方法......

例如,忽略空参数可以通过以下方式存档:
 ... and (e.field = :fieldVal or :fieldVal is null)

UPDATE 相关资源:
  • Passing empty list as parameter to JPA query throws error
  • https://hibernate.atlassian.net/browse/HHH-8091(Hibernate 生成 SQL - "in ()"- 这至少在 Oracle、MySQL 和 Postgres 中是无效的)
  • 最佳答案

    Criteria API 是为了救援。
    您正在动态构建 SQL 查询(当您通过构建工具插件从实体生成特殊类时,有可能实现类型安全)。
    Spring Data 以 org.springframework.data.jpa.domain.Specification + 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);
    Hibernate Criteria API 支持 nullAND 中的 OR 忽略该表达式,如果将 IN 运算符构建器放在实用程序函数中,则可以方便地省略空检查。

    关于hibernate - 处理 JPA 中的空或空集合参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559230/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com