Критерии гибернации вызывают 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));
Это вызывает 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_. Есть еще один способ определить критерии так, чтобы ссылки были "более" TAmbitos.nombre
и не TAmbitosByIdPais.nombre
?
Благодарю.
2 ответа
Hibernate Criteria API поддерживает специальные {alias}
заполнитель для этого случая:
crit.add( Restrictions.sqlRestriction(
"translate(upper({alias}.nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
param+"%", Hibernate.STRING));
Документация для спасения:
Примените ограничение, выраженное в SQL. Любые вхождения {alias} будут заменены псевдонимом таблицы.
(акцент мой)