[英]JPA Native Query set null parameter
這是我的代碼部分:
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
有時可以為null(Date類對象)。 如果為null,則拋出以下異常:
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
如何使這段代碼工作並將空值保存到數據庫中?
你正在使用postgresql(已經是堆棧告訴了),可能是Hibernate,幾乎肯定會遇到這個問題: PostgreSQL JDBC Null String作為bytea
我使用了這個特定的解決方案: https : //stackoverflow.com/a/23501509/516188
這意味着轉義為Hibernate API,因此您可以提供表達式的類型。
在我的情況下,它是一個可以為空的Short,所以我用過:
.setParameter("short", shortValue, ShortType.INSTANCE);
shortValue屬於Short
類型。
如果你沒有使用Hibernate,但是你正在使用EclipseLink,你可以使用查詢提示: https : //wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Query_Hints
示例查詢:
String insert = "INSERT INTO mytable VALUES ( ?, ?, ?, ?)";
em = getEntityManager();
em.getTransaction().begin();
Query u = em.createNativeQuery(insert);
u.setHint(QueryHints.BIND_PARAMETERS, HintValues.FALSE);//<--the hint
u.setParameter(1, "value1");
u.setParameter(2, "value2");
u.setParameter(4, "value4");//just skipped the null element
u.executeUpdate();
em.getTransaction().commit();
結果將是一個插入:
mytable
column1 column2 column3 column4
value1 value2 value4
當然如果“column3”在db中可以為空...
我不知道是否也適用於Hibernate,但它可以。 我使用PostgreSQL進行測試。
使用EntityManager.createNamedQuery
時我遇到了同樣的問題(猜測與createNativeQuery相同的問題)。
如果您要將nullable
參數傳遞給Query,則使用允許傳遞類型的TypedParameterValue。
例如:
setParameter("paramName", new TypedParameterValue(StandardBasicTypes.LONG, paramValue));
在這里,您可以顯式設置傳遞值的類型,並在傳遞空值時作為處理器知道確切類型。
在我的例子中,使用Oracle 12和jboss 7.3,我解決了使用空字符串作為參數值。 我不明白為什么,但它的確有效。 這是我的代碼:
String sql = "insert into customer (id,name,age) values (?1,?2,?3);
em = getEntityManager();
Query query = em.createNativeQuery(sql);
query.setParameter(1, getId());
query.setParameter(2, getName());
if (getAge() != null) {//getAge() return BigDecimal and map a NUMBER column type
query.setParameter(3, getAge());
} else {
query.setParameter(3, "");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.