并非所有命名参数都已在特定条件下设置

时间:2014-02-13 09:54:28

标签: java hibernate postgresql

我在Hibernate中使用了以下查询,即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月”
  2. 然而,通过createSQLQuery使用它,如下所示, 它抛出“ org.hibernate.QueryException:并未设置所有命名参数:[:date]

    请注意,日期已被用作' 2013-01-01':: date

    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 个答案:

答案 0 :(得分:12)

尝试将Postgres-specific (::) type cast替换为SQL标准版 - CAST ('2013-01-01' AS DATE)(或DATE '2013-01-01')。

答案 1 :(得分:3)

如果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字符串中的\,因此对于您不想要的任何\\:字符,转义序列为:表示命名参数。