JPA,Eclipselink,MySQL。你如何查询null?

时间:2014-01-28 00:13:35

标签: java mysql java-ee jpa eclipselink

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

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

即使你有一个street_address为null的列,你也会获得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

4 个答案:

答案 0 :(得分:4)

根据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()不为null,则第一个OR表达式与查询相关。否则仍然匹配第二个表达式。

答案 1 :(得分:3)

首先,谢谢大家的答案。事实证明,这是MySQL的限制,对于RDBMS来说,NULL!= NULL并且EclipseLink不能正常处理这种情况,这有点奇怪。

EclipseLink可以通过禁用查询解析缓存来创建正确的IS NULL sql。您可能会受到性能影响。我用剖面仪测量了我的,并且看到差异小于0.01ms(基本上超出了我准确测量的能力)。您的里程数当然会有所不同,我建议您使用分析器来查看它是否真的很重要。这并不意味着您正在禁用准备好的语句,这会导致大量性能损失。这对我的案例来说相对较小。

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

答案 2 :(得分:0)

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

所以你必须手动检查null,即代码。您可以构建两个依赖于参数值的查询,也可以使用条件API动态构建查询。在这种情况下(如果仅使用一个参数保持这种简单),第一个变体是优选的;如果你有更高或可变数量的参数,你应该使用后者。

答案 3 :(得分:-1)

有一个名为isnull()的mysql命令,使用此SELECT id,city,last_updated,street_address,zipcode,state_id FROM地址WHERE isnull(street_address)