簡體   English   中英

JPA Native Query設置null參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM