gpt4 book ai didi

java - Hibernate Criteria 导致 ORA-00918 : column ambiguously defined

转载 作者:行者123 更新时间:2023-12-03 22:01:53 24 4
gpt4 key购买 nike

我正在运行以下代码:

      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 无法判断我引用的是哪个“nombre”字段。我可以通过在 sqlRestriction 中添加 this_ 来克服这个问题:

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

但我不知道这是否是最佳解决方案,因为我不确定 SQL 是否会始终将查询表引用为 this_。还有另一种定义条件的方法,因此“nombre”引用 TAmbitos。 nombre 而不是 TAmbitosByIdPais.nombre

谢谢。

最佳答案

对于这种情况,Hibernate Criteria API 支持一个特殊的 {alias} 占位符:

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

关于java - Hibernate Criteria 导致 ORA-00918 : column ambiguously defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7712992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com