2014-02-12 120 views
7

這裏是我的代碼部分:JPA原生查詢設置空參數

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有時可以爲空(Date類對象)。而如果是空以下異常被拋出:

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 

怎麼可能得到這個代碼工作,堅持空值到數據庫?

+0

什麼是您的數據庫?你能直接執行查詢嗎? – Soosh

+0

你在數據庫中檢查列是否確實允許NULL?另外,請檢查實體中的字段是否用'@Column(nullable = true)'註解? –

+1

** PostgreSQL 9.2。**是的,我可以直接這樣做:'insert into table_name(value_one,value_two,value_three)values('test','test',NULL);' –

回答

4

您正在使用PostgreSQL(已經堆棧告知),並有可能休眠,而且幾乎可以肯定達不到這個問題:PostgreSQL JDBC Null String taken as a bytea

我用這個特定的解決方案: https://stackoverflow.com/a/23501509/516188

因此,這意味着逃到Hibernate API,所以你可以給出表達式的類型。

在我的情況下,它是一個可空短,所以我用:Short類型的

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

感的shortValue。

+0

無法解析方法'setParameter(java.lang.String,java.lang.Long,org.hibernate.type.LongType)' –

3

,如果你不使用休眠模式,但您使用的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進行測試。

+0

感謝貢獻良好 – SoftMolina