【问题标题】:How to escape colon `:` within a native SQL query in Hibernate?如何在 Hibernate 的本机 SQL 查询中转义冒号`:`?
【发布时间】:2015-11-11 14:52:48
【问题描述】:

我有一个看起来像这样的原生 SQL 查询:

Query query = session.createSQLQuery("SELECT
        XMLSERIALIZE
        (CONTENT
          XMLELEMENT
          (
            NAME \"ltc:DOAATLTC\",
            XMLATTRIBUTES
            (
              'http://www.edftrading.com/Trade/Common/DoaatLTC' AS \"xmlns:ltc\",
              'http://www.edftrading.com/Trade/Common/DoaatLTCHourlyNomination' AS \"xmlns:ltchnom\"
            ),
            XMLELEMENT ( ... ) FROM ...");

问题在于 Hibernate 将 :DOAATLTC\",:ltc\",:ltchnom\", 解释为参数,并期望我们给出值 query.setString("DOAATLTC\",", ...)query.setString("ltc\",", ...)query.setString("ltchnom\",", ...)

但我不希望 Hibernate 那样解释,所以我想转义冒号 :

怎么做?

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    在 Hibernate 中,转义是通过添加 \ 来完成的。但是在 Java 中,您还必须将 \ 转义为另一个 \。所以每个: 都需要替换为\\:。最后,你得到:

    Query query = session.createSQLQuery("SELECT
        XMLSERIALIZE
        (CONTENT
          XMLELEMENT
          (
            NAME \"ltc\\:DOAATLTC\",
            XMLATTRIBUTES
            (
              'http://www.edftrading.com/Trade/Common/DoaatLTC' AS \"xmlns\\:ltc\",
              'http://www.edftrading.com/Trade/Common/DoaatLTCHourlyNomination' AS \"xmlns\\:ltchnom\"
            ),
            XMLELEMENT ( ... ) FROM ...");
    

    【讨论】:

    • 刚试了下还是不行。它说:ERROR: ORA-00911: caractère non valide
    • 不,不一样。之前是Exception in thread "main" org.hibernate.QueryException: Not all named parameters have been set: [ltc", DOAATLTC", ltchnom"]
    • 稍等,想了想。您当然是对的,并且此错误消息ERROR: ORA-00911: caractère non valide 必须是新的错误消息,因为您的解决方案已解决了先例Exception in thread "main" org.hibernate.QueryException: Not all named parameters have been set: [ltc", DOAATLTC", ltchnom"]
    • 好吧,我修复了与该问题的问题有关的第二条错误消息。所以,我可以保证您的解决方案可以正常工作。
    【解决方案2】:

    如果您的冒号是 SELECT reltuples::BIGINT 这样的强制转换,那么您可以将其重写为 cast(reltuples as BIGINT) 以避免冒号。

    ref

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2020-12-23
      • 1970-01-01
      相关资源
      最近更新 更多