2014-02-13 28 views
3

我一直在使用,然後按照我的休眠,即createSQLQuery並非所有的命名參數已經在特定條件下被設置

SELECT to_char(dd, 'Mon YYYY') FROM generate_series('2013-01-01'::date, date_trunc('month', now()), '1 month') as dd 

查詢PostgreSQL中爲

運行時產生輸出
  1. 「2013年1月」「 2013年2月「。 。 「2014年2月」

但是在使用它通過createSQLQuery如下, 它會拋出 「org.hibernate.QueryException:並非所有的命名參數已設置:[:日期]

請注意該日期已被使用,如 '2013-01-01' ::日期

try{ 
      session = HibernateSessionFactory.getSession(); 
      tx = session.beginTransaction(); 

      Query query = session.createSQLQuery("SELECT to_char(dd, 'Mon YYYY') FROM generate_series('2013-01-01'::date, date_trunc('month', now()), '1 month') as dd"); 
      monthList = new ArrayList<String>();    
      monthList = query.list(); 
      tx.commit(); 
     } 

請建議

+2

嘗試替換[Postgres特定('::')類型轉換](http://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS )與SQL標準之一 - CAST('2013-01-01'AS DATE)'(或'DATE'2013-01-01'')。 –

回答

9

嘗試用SQL標準的替換 - CAST ('2013-01-01' AS DATE)(或DATE '2013-01-01')。

2

如果您的SQL String中有:個字符,解析器會將它們視爲命名參數,除非您將其轉義。 Milen A. Radev建議的替代CAST語法對於該特定情況是很好的,但是在某些情況下不存在無用的替代語法,例如,數組切片:

SELECT count(*), 
    array_to_string((array_agg(id order by whenCreated desc))[1\\:20], ',') ids 
FROM … 

不同版本的解析器org.hibernate.engine.query.spi.ParameterParser的允許:字符轉義不同,但他們似乎都認識\:,所以這是我用過的東西。有些版本也允許::代表逃脫:,但我沒有測試過。

注意,像往常一樣,您還需要逃避你\在Java字符串,因此,轉義序列爲\\:爲您不想代表一個名爲參數的任何:字符。

+0

哈!我不敢相信我沒有想過這樣做。根據我的特殊需要,澆鑄解決方案更具可讀性,但引用':'也適用。 – Lambart

相關問題