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