JPA 本机查询集空参数

2022-09-03 05:13:58

这是我的代码部分:

Query q = em.createNativeQuery("insert into table_name (value_one, value_two, value_three) values (?,?,?)");
q.setParameter(1, value1);
q.setParameter(2, value2);
q.setParameter(3, value3);
q.executeUpdate();

value3有时可以为空(日期类对象)。如果为空,则引发以下异常:

  Caused by: org.postgresql.util.PSQLException: ERROR: column "value_three" is of type timestamp without time zone but expression is of type bytea
  Hint: You will need to rewrite or cast the expression.
  Position: 88
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:189)
    ... 11 more

如何使此代码正常工作并将空值保存到数据库中?


答案 1

我在使用时遇到了同样的问题(猜测createNativeQuery的相同问题)。EntityManager.createNamedQuery

如果您要将参数传递给查询,请使用允许传递类型的 TypedParameterValue。nullable

例如:

setParameter("paramName", new TypedParameterValue(StandardBasicTypes.LONG, paramValue));

在这里,您可以显式设置传递值的类型,并且当您传递空值时,处理器知道确切的类型。


答案 2

你正在使用postgresql(已经堆栈告诉了这一点),并且可能是Hibernate,并且几乎可以肯定会遇到这个问题:PostgreSQL JDBC Null String被当作bytea

我用了这个特定的解决方案:https://stackoverflow.com/a/23501509/516188

因此,这意味着要转义到休眠 API,以便您可以提供表达式的类型。

在我的情况下,它是一个可为空的空头,所以我使用了:

.setParameter("short", shortValue, ShortType.INSTANCE);

shortValue 类型 。Short


推荐