Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 条件为空时发生JDBC错误_Java_Sql_Postgresql_Scala_Jdbc - Fatal编程技术网

Java 条件为空时发生JDBC错误

Java 条件为空时发生JDBC错误,java,sql,postgresql,scala,jdbc,Java,Sql,Postgresql,Scala,Jdbc,我正在使用Scala中的JDBC和ScalikeJDBC库 让我们做一个简单的查询:UPDATE“test\u table”SET“test”=1234,其中(“asdad”为null) 如果我直接将这个查询传递给psql,或者通过JDBC原始执行它,一切都会正常工作。但是如果我尝试将null作为参数传递,我会得到以下错误:org.postgresql.util.psqleexception:error:syntax error在“$1”处或附近 我通过如下方式传递null值: session.

我正在使用Scala中的JDBC和ScalikeJDBC库

让我们做一个简单的查询:
UPDATE“test\u table”SET“test”=1234,其中(“asdad”为null)

如果我直接将这个查询传递给
psql
,或者通过JDBC原始执行它,一切都会正常工作。但是如果我尝试将
null
作为参数传递,我会得到以下错误:
org.postgresql.util.psqleexception:error:syntax error在“$1”处或附近

我通过如下方式传递
null
值:

session.update("""UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is ?)""", null)
ScalikeJDBC库会自动将
占位符转换为
$1
。执行的查询显示在Scala控制台中:

   UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is null)  

谢谢

之后不允许使用参数。您必须将
为空
不为空
写入固定表达式

允许的是
=$1
,然后将此占位符设置为
null
,但这不会导致与
null
的比较总是
未知

见相关问题:


之后不允许使用参数。您必须将
为空
不为空
写入固定表达式

允许的是
=$1
,然后将此占位符设置为
null
,但这不会导致与
null
的比较总是
未知

见相关问题:

给出了一个完美的解释——除了他的参考资料是针对SQL Server的(这恰好是一致的,在这种情况下,两者都使用标准SQL)

您仍然可以使用标准运算符参数化单个查询:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad = ?
                  OR    (asdad IS NULL) = ?
              )""", null, true);
对于任何其他价值:

              ... , 123, false);
确保观察是否添加了更多的
WHERE
条件

更好的方法是使用以下方法:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad IS NOT DISTINCT FROM ?
              )""", null);
适用于
NULL
以及任何其他值。

给出了一个完美的解释-除了他的参考是针对SQL Server的(这恰好是一致的,在这种情况下,两者都使用标准SQL)

您仍然可以使用标准运算符参数化单个查询:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad = ?
                  OR    (asdad IS NULL) = ?
              )""", null, true);
对于任何其他价值:

              ... , 123, false);
确保观察是否添加了更多的
WHERE
条件

更好的方法是使用以下方法:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad IS NOT DISTINCT FROM ?
              )""", null);

适用于
NULL
以及任何其他值。

谢谢。从用户端传递“isnull”的首选方式是什么?我能想象的最简单的方法就是简单的字符串插值,但这似乎不是最好的方法。是的,字符串。它是查询表达式的一部分,因此,如果您想根据某个条件在“IS NULL”和“IS NOT NULL”之间切换,这可能是最好的方法。使用条件构建准备好的语句。如果要在
NULL
上进行测试,请使用
IS NULL
,在其他情况下,请使用
IS NOT NULL
编写准备好的语句。谢谢,这很有意义。幸运的是,我可以使用查询生成器,只需在
.where(“foo为NULL”)
.where(“foo不为NULL”)
(伪代码)之间切换即可。谢谢。从用户端传递“isnull”的首选方式是什么?我能想象的最简单的方法就是简单的字符串插值,但这似乎不是最好的方法。是的,字符串。它是查询表达式的一部分,因此,如果您想根据某个条件在“IS NULL”和“IS NOT NULL”之间切换,这可能是最好的方法。使用条件构建准备好的语句。如果要在
NULL
上进行测试,请使用
IS NULL
,在其他情况下,请使用
IS NOT NULL
编写准备好的语句。谢谢,这很有意义。幸运的是,我可以使用查询生成器,只需在
.where(“foo为NULL”)
.where(“foo非NULL”)
(伪代码)之间切换即可。这是一个有趣的见解,感谢您的提示!实际上,我需要支持不同的数据库后端,例如MySQL、Postgres和SQL Server。实际上,这两种解决方案都是标准的SQL:。遗憾的是,并不是所有的RDBMS都像Postgres那样雄心勃勃地实现标准功能……这是一个有趣的见解,谢谢你的提示!实际上,我需要支持不同的数据库后端,例如MySQL、Postgres和SQL Server。实际上,这两种解决方案都是标准的SQL:。遗憾的是,并不是所有的RDBMS都像Postgres那样雄心勃勃地实现标准功能。。。