我在Hibernate中使用了以下查询,即createSQLQuery
SELECT to_char(dd, 'Mon YYYY') FROM generate_series('2013-01-01'::date, date_trunc('month', now()), '1 month') as dd
在PostgreSQL中以
运行时产生输出然而,通过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();
}
请建议
答案 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字符串中的\
,因此对于您不想要的任何\\:
字符,转义序列为:
表示命名参数。