【问题标题】:Hibernate null parameter native query Spring BootHibernate 空参数原生查询 Spring Boot
【发布时间】:2018-09-25 14:55:26
【问题描述】:

我正在尝试将 null 参数 (:searchQuery) 传递给 Spring Boot 中的本机查询,我尝试了各种不同的方法,但每当我传递 null 时,我都会收到错误

错误:运算符不存在:文本~~字节茶

查询

@Query(value = "SELECT count(*) FROM analysis_history ah, analysis_group ag WHERE ah.analysis_group_id = ag.id "
+ "AND ah.creation_date BETWEEN :from AND :to AND ((:searchQuery IS NULL) OR (:searchQuery IS NOT NULL AND ag.name LIKE :searchQuery))", nativeQuery = true)
Long count(@Param("from") Date from, @Param("to") Date to, @Param("searchQuery") String searchQuery);

谁能帮忙?

【问题讨论】:

    标签: spring postgresql hibernate spring-boot


    【解决方案1】:

    你不能使用like null

    SELECT count(*) FROM analysis_history ah, analysis_group ag 
    WHERE ah.analysis_group_id = ag.id AND ah.creation_date 
    BETWEEN :from AND :to AND ag.name LIKE :searchQuery
    

    当 searchQuery 参数为 null 时,您在 searchQuery 中传递 '%' 吗?例如

    repository.count(from, to, searchQuery == null ? "%" : searchQuery);
    

    【讨论】:

    • 这不会对性能产生影响吗?如果它为空,我基本上想忽略 searchQuery
    • 是的。在这种情况下,我会创建两个不同的查询
    • 问题是,我有多种不同的组合,所以会复制所有内容。 Hibernate 必须支持可选/空参数?
    • 那不是休眠。你有一个 SQL 语句。所以你应该首先尝试让这个 SQL 语句在你的应用程序之外运行。
    • 它确实在我的数据库客户端中作为原生查询运行,带有空值。无论如何,谢谢,我会尝试一些替代方案。
    【解决方案2】:

    有一种方法可以绕过它,但您需要访问 EntityManager,而不是使用 @Query 注释为您创建该实现。

    Long count(Date from,Date to, String searchQuery) {
        Number n = em.createNativeQuery("... that query")
                .setParameter("from", from, TemporalType.DATE) // assuming that's a Date, and not TimeStamp
                .setParameter("to", to, TemporalType.DATE)
                .setParameter("searchQuery", "")
                .setParameter("searchQuery", searchQuery)
                .getSingleResult();
        return n.longValue();
    }
    

    第一次调用.setParameter("searchQuery", "") 告诉 Hibernate 这是什么类型,下一个设置值。

    问题来自 Postgres 在解析过程中进行类型检查,并且在参数集为空的情况下没有延迟错误。

    【讨论】:

      【解决方案3】:

      @coladict 提出的问题的替代解决方法,它与 Query 兼容并且性能与原始版本一样好。

      SELECT count(*)
      FROM analysis_history ah, analysis_group ag 
      WHERE ah.analysis_group_id = ag.id 
      AND ah.creation_date BETWEEN :from AND :to 
      AND (:searchQuery IS NULL OR ag.name LIKE CAST(:searchQuery AS CHARACTER VARYING))
      

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2020-02-27
        • 2014-07-15
        • 1970-01-01
        • 2021-09-15
        相关资源
        最近更新 更多