Hibernate Criteria导致ORA-00918:列模糊定义

Ave*_*oes 2 java oracle hibernate ora-00918

我正在运行以下代码:

      Criteria crit = dao.getSesion().createCriteria(TAmbitos.class);
      crit.add( Restrictions.sqlRestriction("translate(upper(nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
              param+"%", Hibernate.STRING));
      crit.add(Restrictions.eq("tipoAmbito", "Empresa"));

      crit.setFetchMode("TAmbitosByPais", FetchMode.JOIN);
      crit.createAlias("TAmbitosByPais", "TAmbitosByPais", CriteriaSpecification.LEFT_JOIN);
      crit.add(Restrictions.eq("TAmbitosByPais", ambito));
Run Code Online (Sandbox Code Playgroud)

这导致ORA-00918: column ambiguously defined异常.该条件有一个表TAmbitos引用自身TAmbitosByPais(任何给定的TAmbitos行都有一个TAmbitosByIdPais引用另一个的字段TAmbitos).生成的SQL是:

SELECT this_.id_ambito AS id1_2_1_, this_.depende_empresa AS depende2_2_1_,
   this_.id_zona AS id3_2_1_, this_.pais AS pais2_1_,
   this_.id_cls_soc AS id5_2_1_, this_.tipo_ambito AS tipo6_2_1_,
   this_.nombre AS nombre2_1_, this_.clave_antigua AS clave8_2_1_,
   this_.desactivado AS desactiv9_2_1_,
   tambitosby1_.id_ambito AS id1_2_0_,
   tambitosby1_.depende_empresa AS depende2_2_0_,
   tambitosby1_.id_zona AS id3_2_0_, tambitosby1_.pais AS pais2_0_,
   tambitosby1_.id_cls_soc AS id5_2_0_,
   tambitosby1_.tipo_ambito AS tipo6_2_0_,
   tambitosby1_.nombre AS nombre2_0_,
   tambitosby1_.clave_antigua AS clave8_2_0_,
   tambitosby1_.desactivado AS desactiv9_2_0_
  FROM sac_conf.t_ambitos this_ LEFT OUTER JOIN sac_conf.t_ambitos tambitosby1_
       ON this_.pais = tambitosby1_.id_ambito
 WHERE TRANSLATE (UPPER (nombre), 'ÁÉÍÓÚ', 'AEIOU') LIKE
                                       TRANSLATE (UPPER (?), 'ÁÉÍÓÚ', 'AEIOU')
   AND this_.tipo_ambito = ?
   AND this_.pais = ?
Run Code Online (Sandbox Code Playgroud)

正如您在WHERE子句中看到的那样,SQL无法分辨我引用的"nombre"字段.我可以通过在sqlRestriction中添加this_来克服这个问题:

crit.add( Restrictions.sqlRestriction("translate(upper(this_.nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
                  nombre+"%", Hibernate.STRING));
Run Code Online (Sandbox Code Playgroud)

但是我不知道它是否是最好的解决方案,因为我不能确定SQL是否会始终将查询的表引用为this_.还有另一种方法来定义Criteria所以"nombre"引用TAmbitos.nombre而不是TAmbitosByIdPais.nombre吗?

谢谢.

axt*_*avt 5

Hibernate Criteria API支持{alias}这种情况的特殊占位符:

crit.add( Restrictions.sqlRestriction(
   "translate(upper({alias}.nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
   param+"%", Hibernate.STRING)); 
Run Code Online (Sandbox Code Playgroud)

  • 如果你想知道,就像我做的那样:是的,你必须输入`{alias}`这不是{yourTableAlias}或{myTableAlias}它是一个特殊的占位符,就像axtavt刚刚解释的那样. (2认同)