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

Java 并非所有命名参数都是在特定条件下设置的,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

我在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.hibernate.QueryException:未设置所有命名参数:[:date]

    请注意,使用的日期类似于“2013-01-01”::日期

    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'
    )替换。哈!我真不敢相信我没想过要尝试。根据我的特殊需要,铸造解决方案更具可读性,但引用“:”也有效。在你的帖子中,在“铸造”之后的换行符有点混乱。