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



我在我的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月"

但是,在通过创建SQL查询使用它时,如下所示,它抛出"org.hibernate.QueryException:并非所有命名参数都已设置:[:d ate]"

请注意,日期已使用为"2013-01-01"::d ate

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();
        }

请建议

尝试替换特定于 Postgres 的 (::)使用 SQL 标准类型转换 - CAST ('2013-01-01' AS DATE)(或 DATE '2013-01-01' )。

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

最新更新