【问题标题】:The identification variable 'TO_DATE' is not defined in the FROM clauseFROM 子句中未定义标识变量“TO_DATE”
【发布时间】:2021-08-17 16:35:21
【问题描述】:

我正在尝试添加 TO_DATE () 以便能够以字符串格式传递日期并生成按日期过滤的查询,但是在发送 TO_DATE 时会生成此错误

查询是:

 @NamedQuery(name = "MvTarifa.obtenerTarifaPorCc", query = "SELECT m FROM MvTarifa m "
        + "INNER JOIN m.maTarifero t "
        + "INNER JOIN m.listaMvCtacteTariferos ct "
        + "WHERE m.tarffechainivigen <= TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD') "
        + "AND m.tarffechafinvigen > TO_DATE('"+"TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD')"+"', 'YYYY-MM-DD') "
        + "AND t.tarffechainivigen <= TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD') "
        + "AND t.tarffechafinvigen > TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD') "
        + "AND ct.cttafechainivigen <= TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD') "
        + "AND ct.cttafechafinvigen >= TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD') "
        + "AND ct.ctactenumero = :numeroCuentaCorriente "
        + "AND m.ccorcodigo = :tarifaAsociadaCtaCte "
        + "AND t.tarimeson = :tarifaAsociadaMeson "
        + "AND t.emprcodigo = :codigoEmpresa "
        + "AND ct.emprcodigo = :codigoEmpresa "
        + "AND m.tarfversion > 0"),

【问题讨论】:

  • 我不懂 Java,但肯定有一种方法可以将适当类型的变量作为绑定传递,而不是传递字符串并要求数据库进行转换?

标签: java sql oracle


【解决方案1】:

您想删除所有绑定变量周围的单引号:

TO_DATE(:fechaactual, 'YYYY-MM-DD')

代替:

TO_DATE(':fechaactual', 'YYYY-MM-DD')

或者,正如你所说的额外的字符串连接操作:

TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD')

应该为TO_DATE 的所有其他实例重复删除单引号,因为您想使用绑定变量而不是字符串文字。

此外,您不希望 TO_DATE 嵌套在字符串文字中:

"AND m.tarffechafinvigen > TO_DATE('"+"TO_DATE('"+":fechaactual"+"', 'YYYY-MM-DD')"+"', 'YYYY-MM-DD') "

应该是:

"AND m.tarffechafinvigen > TO_DATE(:fechaactual, 'YYYY-MM-DD') "

您需要在每个INNER JOIN 后面加上一个ON 表达式来指定连接条件。

@NamedQuery(
  name = "MvTarifa.obtenerTarifaPorCc",
  query = "SELECT m FROM MvTarifa m "
        + "INNER JOIN m.maTarifero t "
        + "ON ( <INSERT YOUR JOIN CONDITION HERE> )"
        + "INNER JOIN m.listaMvCtacteTariferos ct "
        + "ON ( <INSERT YOUR JOIN CONDITION HERE> )"
        + "WHERE m.tarffechainivigen <= TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND   m.tarffechafinvigen >  TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND   t.tarffechainivigen <= TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND   t.tarffechafinvigen >  TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND  ct.cttafechainivigen <= TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND  ct.cttafechafinvigen >= TO_DATE(:fechaactual, 'YYYY-MM-DD') "
        + "AND  ct.ctactenumero = :numeroCuentaCorriente "
        + "AND   m.ccorcodigo = :tarifaAsociadaCtaCte "
        + "AND   t.tarimeson  = :tarifaAsociadaMeson "
        + "AND   t.emprcodigo = :codigoEmpresa "
        + "AND  ct.emprcodigo = :codigoEmpresa "
        + "AND   m.tarfversion > 0"),

然后您可能会得到一个有效的查询,当您过滤日期同时&gt;=&lt; 相同的值时,它会返回零行;这永远不会是真的。

【讨论】:

  • [79, 86] FROM 子句中未定义标识变量“TO_DATE”。 [141, 148] FROM 子句中未定义标识变量“TO_DATE”。 [203, 210] 标识变量“TO_DATE”未在 FROM 子句中定义。 [265, 272] FROM 子句中未定义标识变量“TO_DATE”。
  • @VíctorEduardoDuqueRosales 您是否尝试让您的查询直接针对数据库运行?使用 SQL/Plus(或等价物)进行连接并使查询在语法上有效(使用硬编码值而不是绑定变量)并生成所需的行,然后将其复制粘贴到 Java 代码中并进行更改回到使用绑定变量。
  • 如果我尝试过查询,在 Dbeaver 中,问题出在 javax.persistence.NamedQuery;这个库不允许我使用 TO_DATE
  • 公开列表 obtenerTarifasPorEmpresaDom(long codigoEmpresa, boolean esDomicilio) { try { System.out.println("QUERY!!!! " + date);查询咨询 = em.createNamedQuery("MvTarifa.obtenerTarifaPorEmpresaDom", MvTarifa.class); //consulta.setParameter("fechaactual", new Date()); Consulta.setParameter("fechaactual", date); Consulta.setParameter("codigoEmpresa", codigoEmpresa); Consulta.setParameter("tarifaAsociadaCtaCte", TARIFA_ASOCIADA_A_CTA_CTE_NO);
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多