Java 并非所有命名参数都是在特定条件下设置的
我在Hibernate中使用了以下查询,即createSQLQueryJava 并非所有命名参数都是在特定条件下设置的,java,hibernate,postgresql,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中作为运行时生成输出的 “2013年1月”“2013年2月”。“2014年2月” 但是,当通过createSQLQuery使用它时,如下所示, 它抛出“org.hibe
SELECT to_char(dd, 'Mon YYYY') FROM generate_series('2013-01-01'::date, date_trunc('month', now()), '1 month') as dd
在PostgreSQL中作为运行时生成输出的
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();
}
试试看{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
Query Query=session.createSQLQuery(“从生成序列('2013-01-01'):日期、日期('month',now()),'1 month')中选择to_char(dd,'Mon yyyyy')作为dd);
monthList=新的ArrayList();
monthList=query.list();
tx.commit();
}
请建议尝试将替换为SQL标准转换('2013-01-01'作为日期)(或日期'2013-01-01') 如果您的SQL
字符串中有:
字符,除非您转义它们,否则解析器将它们视为命名参数。所建议的可选CAST
语法对于该特定情况很好,但在某些情况下,没有简单的可选语法,例如数组切片:
SELECT count(*),
array_to_string((array_agg(id order by whenCreated desc))[1\\:20], ',') ids
FROM …
不同版本的解析器org.hibernate.engine.query.spi.ParameterParser
允许对:
字符进行不同的转义,但它们似乎都能识别\:
,所以我使用了这些。有些版本还允许:
表示转义的:
,但我还没有测试过
请注意,像往常一样,您还需要在Java字符串中转义\
,因此转义序列是\:
,用于任何您不想表示命名参数的:
字符。尝试用SQL标准转换(日期为2013-01-01)
(或日期为'2013-01-01'
)替换。哈!我真不敢相信我没想过要尝试。根据我的特殊需要,铸造解决方案更具可读性,但引用“:”也有效。在你的帖子中,在“铸造”之后的换行符有点混乱。