Foros del Web » Programación para mayores de 30 ;) » Java »

Por qué EJBQL elimina paréntesis??

Estas en el tema de Por qué EJBQL elimina paréntesis?? en el foro de Java en Foros del Web. Hola, ¿Alguien sabe por qué EJBQL elimina paréntesis de una sentencia creada? Es que tengo OR y AND anidados y me hace falta utilizar muchos ...
  #1 (permalink)  
Antiguo 16/12/2009, 04:55
 
Fecha de Ingreso: julio-2003
Mensajes: 463
Antigüedad: 20 años, 9 meses
Puntos: 0
Pregunta Por qué EJBQL elimina paréntesis??

Hola,

¿Alguien sabe por qué EJBQL elimina paréntesis de una sentencia creada?
Es que tengo OR y AND anidados y me hace falta utilizar muchos parentésis. EJBQL al generar la sentencia final, la genera mal(sin paréntesis).

El código es:

EntityManager entityManager;

...

Query query = entityManager.createQuery(sql);

List<Object[]> res = query.getResultList();


Saludos,

Última edición por dominguez; 16/12/2009 a las 05:05
  #2 (permalink)  
Antiguo 16/12/2009, 07:47
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Por qué EJBQL elimina paréntesis??

Muestra el contenido de la variable SQL !
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #3 (permalink)  
Antiguo 16/12/2009, 09:04
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Por qué EJBQL elimina paréntesis??

Que yo sepa EJBQL come mucha fruta y verdura, pero no he oido nunca que coma paréntesis . Como dice dackiller, lo suyo sería ver el SQL, el resultado etc. para averiguar realmente que está pasando y, si es el caso, ver por qué el motor de persistencia que usas ha cambiado de dieta.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 16/12/2009, 09:50
 
Fecha de Ingreso: julio-2003
Mensajes: 463
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Por qué EJBQL elimina paréntesis??

Contenido de la variable SQL:


SELECT
Pyf.pyfid, Pyf.pyffhoramod, Pyf.pyftipodocu, Pyf.pyfsubtipo, Pyf.pyfnumcargo, Pyf.pyfperiodo, Pyf.pyffdocu, Pyf.pyfperfdesde,
Pyf.pyfperfhasta, Pyf.pyfnoapremiable,Pyf.organismosByOrmid.ormid, Orm.ormdesc, Pyf.organismosByOrgOrmid.ormid, Org.ormdesc,
Pyf.pyfdoccontable,Pyf.pyffvalida, Pyf.pyforigen, Pyf.pyfperiodo, Pyf.pyfxestado
FROM
Organismos Org, Organismos Orm, Pliegosfacturas Pyf
WHERE
Pyf.organismosByOrmid.ormid = Orm.ormid AND Pyf.organismosByOrgOrmid.ormid = Org.ormid AND
Pyf.pyfid IN (SELECT Pyf.pyfid FROM Liquidaciones Liq, Detallepliegosfras Dpf WHERE Dpf.liquidaciones.liqid = Liq.liqid AND
Liq.liqnumerorecliquidacion = '200000241013')
AND
(
(
(
(Pyf.pyftipodocu= 'P' AND Pyf.pyfsubtipo = 'P' AND Pyf.pyfperiodo = 'V' AND EXISTS
(SELECT '1' FROM Liquidaciones Liq, Detallepliegosfras Dpf WHERE Dpf.pliegosfacturas.pyfid = pyf.pyfid and Liq.liqid = Dpf.liquidaciones.liqid and liq.liqnumerorecliqsufijo = 0
)
)

OR
(Pyf.pyftipodocu= 'P' AND Pyf.pyfsubtipo = 'P' AND Pyf.pyfperiodo = 'E' AND exists
(select '1' from Detallepliegosfras Dpf where Dpf.pliegosfacturas.pyfid = pyf.pyfid and Dpf.formasexaccion.fexid = 3
)
)
)

OR ((Pyf.pyftipodocu = 'F' AND Pyf.pyfsubtipo = 'B'))

OR (
(Pyf.pyftipodocu= 'P' AND Pyf.pyfsubtipo = 'P' AND Pyf.pyfperiodo = 'E' AND exists
(select '1' from Detallepliegosfras Dpf where Dpf.pliegosfacturas.pyfid = Pyf.pyfid and Dpf.formasexaccion.fexid <> 3 AND Pyf.pyfnumcargo < 200600000000 and Pyf.organismosByOrmid.ormid <> Pyf.organismosByOrgOrmid.ormid
)
)
OR
(Pyf.pyftipodocu = 'P' AND Pyf.pyfsubtipo = 'P' AND Pyf.pyfperiodo = 'V' AND EXISTS
(SELECT '1' FROM Liquidaciones Liq, Detallepliegosfras Dpf WHERE Dpf.pliegosfacturas.pyfid = Pyf.pyfid and Liq.liqid = Dpf.liquidaciones.liqid and Liq.liqnumerorecliqsufijo <> 0 and Pyf.organismosByOrmid.ormid <> 2 AND Pyf.pyfnumcargo < 200600000000
)
)
)

OR

((Pyf.pyftipodocu= 'F' AND Pyf.pyfsubtipo = 'R'))

OR ((Pyf.pyftipodocu= 'F' AND Pyf.pyfsubtipo = 'I'))

OR (
(Pyf.pyftipodocu= 'F' AND Pyf.pyfsubtipo = 'C') AND
(
(Pyf.pyfnumcargo<200600000000 and Pyf.organismosByOrgOrmid.ormid = 2
) OR Pyf.organismosByOrgOrmid.ormid <> 2
)
)

OR ((Pyf.pyftipodocu= 'F' AND Pyf.pyfsubtipo = 'P'))

) AND (
(Pyf.organismosByOrgOrmid.ormid = 3 or Pyf.organismosByOrmid.ormid = 3 or exists
(SELECT '1' FROM Exacciones Mex,Detallepliegosfras Dpf Where Dpf.pliegosfacturas.pyfid = Pyf.pyfid AND Dpf.exacciones.mexid = Mex.mexid and Mex.organismosByOrgOrmid.ormid = 3
)
)
)
)
  #5 (permalink)  
Antiguo 16/12/2009, 09:55
 
Fecha de Ingreso: julio-2003
Mensajes: 463
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Por qué EJBQL elimina paréntesis??

Lo que muestra el LOG de hibernate es lo siguiente. Como ejemplo, pongo en rojo uno de los AND, se puede ver perfectamente como ha eliminado paréntesis y no sólo eso, sino que también ha añadido paréntesis en el exist, también en rojo:

select
pliegosfac2_.PYFID as col_0_0_, pliegosfac2_.PYFFHORAMOD as col_1_0_, pliegosfac2_.PYFTIPODOCU as col_2_0_, pliegosfac2_.PYFSUBTIPO as
col_3_0_, pliegosfac2_.PYFNUMCARGO as col_4_0_, pliegosfac2_.PYFPERIODO as col_5_0_, pliegosfac2_.PYFFDOCU as col_6_0_, pliegosfac2_.PYFPERFDESDE
as col_7_0_, pliegosfac2_.PYFPERFHASTA as col_8_0_, pliegosfac2_.PYFNOAPREMIABLE as col_9_0_, pliegosfac2_.ORMID as col_10_0_, organismos1_.ORMDESC
as col_11_0_, pliegosfac2_.ORG_ORMID as col_12_0_, organismos0_.ORMDESC as col_13_0_, pliegosfac2_.PYFDOCCONTABLE as col_14_0_,
pliegosfac2_.PYFFVALIDA as col_15_0_, pliegosfac2_.PYFORIGEN as col_16_0_, pliegosfac2_.PYFPERIODO as col_17_0_, pliegosfac2_.PYFXESTADO as
col_18_0_
from
ORGANISMOS organismos0_, ORGANISMOS organismos1_, PLIEGOSFACTURAS pliegosfac2_
where
pliegosfac2_.ORMID=organismos1_.ORMID and pliegosfac2_.ORG_ORMID=organismos0_.ORMID and
(pliegosfac2_.PYFID in (select pliegosfac2_.PYFID from LIQUIDACIONES liquidacio3_, DETALLEPLIEGOSFRAS detallepli4_ where
detallepli4_.LIQID=liquidacio3_.LIQID and liquidacio3_.LIQNUMERORECLIQUIDACION='200000241013 '))

and

(pliegosfac2_.PYFTIPODOCU='P' and pliegosfac2_.PYFSUBTIPO='P' and pliegosfac2_.PYFPERIODO='V' and
(exists (select '1' from LIQUIDACIONES liquidacio5_, DETALLEPLIEGOSFRAS detallepli6_ where detallepli6_.PYFID=pliegosfac2_.PYFID and
liquidacio5_.LIQID=detallepli6_.LIQID and liquidacio5_.LIQNUMERORECLIQSUFIJO=0))

or

pliegosfac2_.PYFTIPODOCU='P' and pliegosfac2_.PYFSUBTIPO='P' and pliegosfac2_.PYFPERIODO='E' and
(exists (select '1' from DETALLEPLIEGOSFRAS detallepli7_ where detallepli7_.PYFID=pliegosfac2_.PYFID and detallepli7_.FEXID=3))

or

pliegosfac2_.PYFTIPODOCU='F' and pliegosfac2_.PYFSUBTIPO='B'

or

pliegosfac2_.PYFTIPODOCU='P' and pliegosfac2_.PYFSUBTIPO='P' and pliegosfac2_.PYFPERIODO='E' and
(exists (select '1' from DETALLEPLIEGOSFRAS detallepli8_ where detallepli8_.PYFID=pliegosfac2_.PYFID and detallepli8_.FEXID<>3 and
pliegosfac2_.PYFNUMCARGO<200600000000 and pliegosfac2_.ORMID<>pliegosfac2_.ORG_ORMID))

or

pliegosfac2_.PYFTIPODOCU='P' and pliegosfac2_.PYFSUBTIPO='P' and pliegosfac2_.PYFPERIODO='V' and (exists
(select '1' from LIQUIDACIONES liquidacio9_, DETALLEPLIEGOSFRAS detallepli10_ where detallepli10_.PYFID=pliegosfac2_.PYFID and
liquidacio9_.LIQID=detallepli10_.LIQID and liquidacio9_.LIQNUMERORECLIQSUFIJO<>0 and pliegosfac2_.ORMID<>2 and
pliegosfac2_.PYFNUMCARGO<200600000000))

or

pliegosfac2_.PYFTIPODOCU='F' and pliegosfac2_.PYFSUBTIPO='R'

or

pliegosfac2_.PYFTIPODOCU='F' and pliegosfac2_.PYFSUBTIPO='I'

or

pliegosfac2_.PYFTIPODOCU='F' and pliegosfac2_.PYFSUBTIPO='C'
and (pliegosfac2_.PYFNUMCARGO<200600000000 and pliegosfac2_.ORG_ORMID=2 or pliegosfac2_.ORG_ORMID<>2)

or

pliegosfac2_.PYFTIPODOCU='F' and pliegosfac2_.PYFSUBTIPO='P')

and (pliegosfac2_.ORG_ORMID=3 or pliegosfac2_.ORMID=3 or exists (select '1' from EXACCIONES exacciones11_, DETALLEPLIEGOSFRAS detallepli12_
where detallepli12_.PYFID=pliegosfac2_.PYFID and detallepli12_.MEXID=exacciones11_.MEXID and exacciones11_.ORG_ORMID=3))
  #6 (permalink)  
Antiguo 16/12/2009, 16:39
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Por qué EJBQL elimina paréntesis??

Si las AND tienen precedencia como operadores sobre las OR, no sería el resultado, aunque mucho menos claro, equivalente? Por que a primer vista da la impresión que lo que ha hecho es eliminar los parentesis alrededor de las clausulas AND que igualmente serían "innecesarios" por cuestion de precedencia de operadores.

¿Has probado a ejecutar la consulta en la BDD con los parentesis re-añadidos a ver si así funciona? Si en tu BDD la AND no tiene precedencia sobre la OR, quizá sea un bug del dialecto del Hibernate.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:35.