参数为nullable属性的JPA命名查询where子句中的MySQL条件
如果作为参数传递的某些属性可为null,那么如何在MySQL 5.1数据库的JPA命名查询的where子句中指定条件 示例:该表包含可为空的属性_1和不可为空的属性_2。内容包括: id attribute_1 attribute_2 -- ----------- ----------- 1 {null} 123 2 X 456 id属性_1属性_2 -- ----------- ----------- 1{null}123 2x456 如果:param_1=null且:param_2=“123”,则查询结果应为记录1 如果:param_1=“X”和:param_2=“456”,则查询结果应为记录2 如果例如:param_1=“X”和:param_2=“123”,则查询应该没有结果参数为nullable属性的JPA命名查询where子句中的MySQL条件,mysql,sql,jpa,Mysql,Sql,Jpa,如果作为参数传递的某些属性可为null,那么如何在MySQL 5.1数据库的JPA命名查询的where子句中指定条件 示例:该表包含可为空的属性_1和不可为空的属性_2。内容包括: id attribute_1 attribute_2 -- ----------- ----------- 1 {null} 123 2 X 456 id属性_1属性_2 -- -----------
谢谢 对于第一行,您需要更改查询中的where子句:
where attribute_1 is null
相反,使用
=
将不会产生任何行,因为a=null
始终是null
我使用本机查询解决了这个问题。我无法让它与JP-QL查询一起工作。
我使用了这个条件
AND IF(?1 IS NULL, b.attribute_1 IS NULL, b.attribute_1 = ?1)
在where子句中(?1是参数的占位符)。没有那么简单。例如,在命名查询中,where子句可能类似于
where table.attribute_1=:param_1和table.attribute_2=:param_2
。问题是:param_1可能是Java空值。是的,我也这么认为。但你没有办法这么做。如果:param_1
为空,则pass属性_1为空
,否则属性_1=:param_1
。不同的说法。您可以在:param_1
上加上一个条件组合/或两者,但这样做会损害您的查询计划(如果语句已准备好)。我不确定是否理解您的意思。无法传递像属性_1为null这样的字符串。id并不能解决这个问题,因为查询不能以attribute_1为null
并且attribute_1=param_1
可以正确填写的方式表示。我用另一种方法解决了这个问题,请参见下一个答案。我想说的是,尽管不可能更改它,但您的操作方式(即当var1
为空时发送attr1=var1
)不能也不会返回行。曾经或者根据最初建议的属性值有条件地发送查询。或者使用where(attr1=var1或var1为null)
来代替后面的建议——但要注意,后者不能也不会在attr1
上使用任何适用的索引(如果准备好的话)。您的语句“[…]您的操作方式[…]不能也不会返回行”让我感到困惑。我没有在问题或这些评论中陈述我的问题的解决方案。。。(我在下面自己的回答中说明了解决方案/解决方法)。无论如何,谢谢你的努力。