Критерии гибернации вызывают ORA-00918: столбец двусмысленно определен - PullRequest
2 голосов
/ 10 октября 2011

Я использую следующий код:

      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));

Это вызывает исключение 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 = ?

Как вы можете видеть в предложении WHERE, SQL не может определить, на какое «численное» поле я ссылаюсь.Я могу преодолеть это, добавив this_ в sqlRestriction:

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

Но я не знаю, является ли это лучшим решением, так как не могу быть уверен, будет ли SQL всегда ссылаться на запрашиваемую таблицу как this_.Thereэто еще один способ определения критериев, так что «номерные» ссылки TAmbitos.nombre, а не TAmbitosByIdPais.nombre?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 10 октября 2011

Hibernate Criteria API поддерживает специальный {alias} заполнитель для этого случая:

crit.add( Restrictions.sqlRestriction(
   "translate(upper({alias}.nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
   param+"%", Hibernate.STRING)); 
2 голосов
/ 10 октября 2011

Документация на помощь:

Применить ограничение, выраженное в SQL. Любые вхождения {alias} будут быть заменен псевдонимом таблицы.

(акцент мой)

...