Hi,

 

I'm not familiar with the decode function, but I would check the
ResultSet debug logging and see if 'decode(
IDENTIFICATORI_VALORE.TIPO_RIGA_ID, null, 0, 1) as DI_TIPO_RIGA'
actually returns the results you're expecting.

 

Niels

________________________________

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, February 12, 2008 7:07 PM
To: [email protected]
Subject: Re: discriminator and submap

 


> Niels Beekman 
> Sat, 04 Nov 2006 03:35:52 -0800 
> If only if/else behaviour is required, why not create an additional 
> column? Something like: 

[...] 

Hi all 
Following the Niels' suggestion
<http://www.mail-archive.com/[email protected]/msg06786.html>
I wrote the map and query (see below) 
A column TIPO_RIGA_ID of the table IDENTIFICATORI_VALORE is nullable.
Only when it's NOT null then we have to load other data (i.e. when the
TIPO_RIGA_ID column is null no other data shold be loaded). 
An additional column DI_TIPO_RIGA is created on the fly along with the
corresponding discriminator. 
The discriminator holds 1 iff the TIPO_RIGA_ID is not null, otherwise it
holds 0. 

The problem (see the top of the exception stack below) arises when the
TIPO_RIGA_ID column is null. 
=> the nullity of TIPO_RIGA_ID is the cause of the
IllegalArgumentException
<http://www.mail-archive.com/[email protected]/msg10415.html>

This is can be easily proved by removing (or readding) the 

                or IDENTIFICATORI_VALORE.TIPO_RIGA_ID is null 

selection clause from (to) the query.
Please note that the whole SQL query (complete of rows with null
ID_TIPO_RIGA) runs successfully (i.e. the problem is on the iBatis
side). 

The DB is Oracle 8.x. Please note that the query relies on
shortcircuiting. 
I suspect that iBatis tries to perform 

                <result property="idTipoRiga" column="TIPO_RIGA_ID"
jdbcType="NUMERIC" javaType="int"/> 

of the mapEspressioneValoriTipoRigaMulti (sub) result map that should be
instead excluded by the 0 value of the discriminator. 
I have no else branch here (no data to be loaded when the discriminator
holds 0). 

Might the lack of the "else" (zeroed value) branch be the problem? 
Any suggestion? 



Query 

        <select id="selectEspressioneValoriMulti"
resultMap="mapEspressioneValoriTipoRigaMulti"> 
                select VALORE_ID 
                         , FORMULA_ID 
                         , IDENTIFICATORI_VALORE.TIPO_RIGA_ID 
                         , TESTO 
                        ,  decode( IDENTIFICATORI_VALORE.TIPO_RIGA_ID,
null, 0, 1) as DI_TIPO_RIGA                         
                from IDENTIFICATORI_VALORE 
                   , TIPI_DATO_RIGA 
                where IDENTIFICATORI_VALORE.TIPO_RIGA_ID is not null 
                and   IDENTIFICATORI_VALORE.TIPO_RIGA_ID =
TIPI_DATO_RIGA.TIPO_RIGA_ID 
                and  FORMULA_ID not in 
                ( 
                        select        FORMULA_ID 
                        from        IDENTIFICATORI_FORMULA 
                        where        NORMATIVA_ID is null 
                ) 
                and TIPI_DATO_RIGA.TIPO_ELEMENTO_ID in 
                ( 
                        select        TIPO_DATO_ID 
                        from        TIPI_DATO_ELEMENTO 
                ) 
                or IDENTIFICATORI_VALORE.TIPO_RIGA_ID is null 
        </select> 


Map 

        <resultMap id="mapEspressioneValoriMulti"
class="it.finmatica.gpj.ec.istruzioni.EspressioneStruct"> 
                <result property="id" column="VALORE_ID"
jdbcType="NUMERIC" javaType="int"/> 
                <result property="idIdentificatore"
select="Gpj.selectIdIdentificatore" column="FORMULA_ID" javaType="int"/>

                <result property="idPeriodoNormativo"
select="Gpj.selectIdPeriodoNormativo" column="FORMULA_ID"
javaType="int"/> 
                <discriminator column="DI_TIPO_RIGA" jdbcType="NUMERIC"
javaType="int"> 
                  <subMap value="1"
resultMap="mapEspressioneValoriTipoRigaMulti" /> 
                </discriminator> 
        </resultMap> 
        <resultMap id="mapEspressioneValoriTipoRigaMulti"
class="it.finmatica.gpj.ec.istruzioni.EspressioneStruct"
extends="mapEspressioneValoriMulti"> 
                <result property="idTipoRiga" column="TIPO_RIGA_ID"
jdbcType="NUMERIC" javaType="int"/> 
                <result property="nome" select="Gpj.selectNomeCampo"
column="TIPO_RIGA_ID" javaType="java.lang.String"/>         
                <result property="testo" column="TESTO"
jdbcType="VARCHAR" javaType="java.lang.String"/> 
        </resultMap> 



Exception stack (top of the) 

com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in
it/finmatica/gpj/aa/frontedb/EspressioneFabbricaImpl.xml.   
--- The error occurred while applying a result map.   
--- Check the Gpj.mapEspressioneValoriTipoRigaMulti.   
--- The error happened while setting a property on the result object.   
--- Cause: com.ibatis.common.exception.NestedRuntimeException: Error
setting properties of
'[EMAIL PROTECTED]'.  Cause:
java.lang.IllegalArgumentException 
Caused by: java.lang.IllegalArgumentException 
Caused by: com.ibatis.common.exception.NestedRuntimeException: Error
setting properties of
'[EMAIL PROTECTED]'.  Cause:
java.lang.IllegalArgumentException 
Caused by: java.lang.IllegalArgumentException 
        at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:188) 
        at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForList(GeneralStatement.java:123) 


Trace of instructions (last 2 statements) 

DEBUG [main] - {pstm-100006} PreparedStatement:    select
IDENTIFICATORE_ID   from IDENTIFICATORI_FORMULA   where FORMULA_ID = ?

DEBUG [main] - {pstm-100006} Parameters: [470] 
DEBUG [main] - {pstm-100006} Types: [java.math.BigDecimal] 
DEBUG [main] - {pstm-100008} PreparedStatement:    select NORMATIVA_ID
from IDENTIFICATORI_FORMULA   where FORMULA_ID = ?   

Reply via email to