Title: Mensagem

I wrote this dynamic select bellow

select
  *
 from ECC_CHAMADO
 <dynamic prepend="WHERE">
  <isNotNull prepend="OR" property="numero">
   CHAMADO_ID = #numero#
  </isNotNull>
  <isNotNull prepend="OR" property="numeroSerie">
   (NUMERO_SERIE = #numeroSerie#
   <isNotNull prepend="AND" property="numero">
    (select count(*) from ECC_CHAMADO where CHAMADO_ID = #numero#) = 0
   </isNotNull>
   )
  </isNotNull>
  <isNotNull prepend="OR" property="clienteId">
   ((
   <isNotNull prepend="OR" property="classificacaoChamadoId">
    (ENTI_CD = #clienteId# AND CLASSIFICACAO_CHAMADO_ID = #classificacaoChamadoId#)
   </isNotNull>
   <isNotNull prepend="OR" property="classificacacoProblemaId">
    (ENTI_CD = #clienteId# AND CLASSIFICACAO_PROBLEMA_ID = #classificacacoProblemaId#)
   </isNotNull>
   <isNotNull prepend="OR" property="statusId">
    (ENTI_CD = #clienteId# AND STATUS_ID = #statusId#)
   </isNotNull>
   <isNotNull prepend="OR" property="canalId">
    (ENTI_CD = #clienteId# AND CANAL_ID = #canalId#)
   </isNotNull>
   )
   <isNotNull prepend="AND" property="numero">
    (select count(*) from ECC_CHAMADO where CHAMADO_ID = #numero#) = 0
   </isNotNull>
   <isNotNull prepend="AND" property="numeroSerie">
    (select count(*) from ECC_CHAMADO where NUMERO_SERIE = #numeroSerie#) = 0
   </isNotNull>
   )
  </isNotNull>
 </dynamic>

If no parameters are null I was expecting this prepared statement to be produced:

select * from ECC_CHAMADO  WHERE
 CHAMADO_ID = ?
 OR
 (NUMERO_SERIE = ? AND (select count(*) from ECC_CHAMADO where CHAMADO_ID = ?) = 0)
 OR
 (
  (
   (ENTI_CD = ? AND CLASSIFICACAO_CHAMADO_ID = ?)
   OR
   (ENTI_CD = ? AND CLASSIFICACAO_PROBLEMA_ID = ?)
   OR
   (ENTI_CD = ? AND STATUS_ID = ?)
  )
  AND
  (select count(*) from ECC_CHAMADO where CHAMADO_ID = ?) = 0
  AND
  (select count(*) from ECC_CHAMADO where NUMERO_SERIE = ?) = 0
 )

But the produced prepared statement has a syntax SQL error with na extra "OR" as follows:

select * from ECC_CHAMADO  WHERE
 CHAMADO_ID = ?
 OR
 (NUMERO_SERIE = ? AND (select count(*) from ECC_CHAMADO where CHAMADO_ID = ?) = 0)
 OR
 (
  (OR
   (ENTI_CD = ? AND CLASSIFICACAO_CHAMADO_ID = ?)
   OR
   (ENTI_CD = ? AND CLASSIFICACAO_PROBLEMA_ID = ?)
   OR
   (ENTI_CD = ? AND STATUS_ID = ?)
  )
  AND
  (select count(*) from ECC_CHAMADO where CHAMADO_ID = ?) = 0
  AND
  (select count(*) from ECC_CHAMADO where NUMERO_SERIE = ?) = 0
 )

How can I correct this? For now, i'm writing a constant _expression_ resulting 'false' after the opening parenthesis, but it's not very elegant way... Ibatis wasn't supposed to detect that this OR is unnecessary?

Thank you.

 


 

 

Reply via email to