【问题标题】:JPA, Eclipselink, MySQL. How do you query for null?JPA、Eclipselink、MySQL。你如何查询null?
【发布时间】:2014-02-19 02:17:31
【问题描述】:

所以在 MySQL 中,NULL != NULL。因此,如果您编写如下查询:

SELECT id, city, last_updated, street_address, zipcode, state_id FROM addresses WHERE street_address = null

即使您有一个 street_address 为空的列,您也会得到 0 行。

EclipseLink 正在生成此 SQL:

[EL Fine]: 2014-01-27 18:07:38.388--ServerSession(2079453576)--Connection(1753616363)--Thread(Thread[Default JMS Resource Adapter-worker- - 3,5,main])--SELECT id, city, last_updated, street_address, zipcode, state_id FROM addresses WHERE (street_address = ?) bind => [null]

它永远不会匹配任何东西。如何让 EclipseLink 使用:is null 而不是 = null

编辑:

感谢您的回答,但如果您阅读了我的问题,我已经知道查询 IS NULL... 但我的查询总是查询 null。我在问您如何让 EclipseLink 自动生成该 SQL?例如,如果我有一个命名查询,并且我将参数设置为 null,我如何让 EclipseLink 生成 IS NULL 而不是 = NULL

【问题讨论】:

    标签: java mysql jakarta-ee jpa eclipselink


    【解决方案1】:

    首先,谢谢大家的回答。事实证明,这是 MySQL 的一个限制,对于 RDBMS 和 EclipseLink 不能优雅地处理这种情况,NULL != NULL 有点奇怪。

    EclipseLink 可以通过禁用查询解析缓存来创建正确的IS NULL sql。您可能会受到性能影响。我用探查器测量了我的,发现差异不到 0.01 毫秒(基本上超出了我准确测量的能力)。当然,您的里程会有所不同,我建议使用分析器来查看它是否真的很重要。这并不意味着您要禁用准备好的语句,这会大量 影响性能。这对我的情况来说相对较小。

    本质上,您需要在执行查询之前设置查询提示。您正在寻找的热门歌曲在这里:http://www.eclipse.org/eclipselink/api/2.0/org/eclipse/persistence/config/QueryHints.html#PREPARE

    【讨论】:

      【解决方案2】:

      根据EclipseLink JPA UserGuide,它确实支持IS NULL / IS NOT NULL 运算符,因此您应该能够编写如下SQL 语句:

      SELECT ... FROM ... WHERE street_address IS NULL
      

      编辑

      例如,如果我有一个命名查询,并且我将一个参数设置为 null, 如何让 EclipseLink 生成 IS NULL 而不是 = NULL

      让 SQL 为您处理。在您的示例中:

      String sql = "SELECT ... FROM ... WHERE (street_address = :address OR street_address IS NULL)";
      Query query = em.createQuery(sql);
      query.setParameter("address", address.getStreetAddress());
      

      如果address.getStreetAddress() 不为空,则第一个OR 表达式与查询相关。否则仍然匹配第二个表达式。

      【讨论】:

        【解决方案3】:

        这是不可能的。查询的创建独立于稍后设置的参数,它不会考虑特定值。我不认为有可能构建一个 JPQL 查询来处理这两种情况并提供您想要的结果。

        因此您必须手动检查null,即在代码中。您可以根据参数的值构建两个选择的查询,或者使用条件 API 动态构建查询。在这种情况下(如果只有一个参数就这么简单),第一个变体更可取;如果您有更多或可变数量的参数,您应该使用后者。

        【讨论】:

          【解决方案4】:

          有一个 mysql 命令叫做 isnull() ,使用这个 SELECT id, city, last_updated, street_address, zipcode, state_id FROM addresses WHERE isnull(street_address)

          【讨论】:

            猜你喜欢
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-03
            • 2018-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多