iBatis + Procs == Problemas

9 respostas
felipempantoja

Olá pessoal. :D

Estamos começando a usar iBatis aqui na empresa, e estamos tomando uma surra pra rodar uma simples proc, queries de consultas normais não tivemos problemas.

Só pra exemplificar o que estamos querendo fazer:
--PROC
CREATE OR REPLACE PROCEDURE PROCEDURE1 ( param1 IN NUMBER, param2 OUT VARCHAR2) AS
BEGIN
  SELECT  COLUNA2      
  INTO
  param2
    FROM   TABELA
    WHERE  COLUNA1 = param1  ;
END PROCEDURE1;
<!-- Mapeamento no xml -->
<resultMap id="myProcTestResult" class="br.com.projeto.modelo.entidade.Tabela">
		<result property="coluna1" jdbcType="NUMBER" javaType="java.lang.Long" column="coluna1"/>
		<result property="coluna2" jdbcType="VARCHAR" javaType="java.lang.String" column="coluna2"/>
	</resultMap>
	<parameterMap id="paramsProcTest" class="map" >
  		<parameter property="coluna1" jdbcType="NUMBER" javaType="java.lang.Long" mode="IN"/>
  		<parameter property="coluna2" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
  	</parameterMap> 
  	<procedure id="myProcTest" resultClass="br.com.projeto.modelo.entidade.Tabela" parameterMap="paramsProcTest" resultMap="myProcTestResult">
 		{call PROCEDURE1(?, ?)}
	</procedure>
//Código no java pra executar a proc pelo ibatis
Map<String, Object> map = new HashMap<String, Object>();
map.put("coluna1", "1");
			
String coluna2 = (String) sqlMapClient.queryForObject("tabela.myProcTest", map);

Alguém sabe dizer onde estou errando? Está passando sem erros, porém a string está vindo nula, como se eu estivesse passando um valor que não existe no banco. :(

9 Respostas

felipempantoja

Ninguém? =/

Pedrosa

Não seria essa chamada que esta errada:

tring coluna2 = (String) sqlMapClient.queryForObject("tabela.myProcTest", map);

O id da procedure no mapeamto é:

myProcTest
felipempantoja

Não po, o prefixo é do namespace do sqlMap

B

na verdade vc só usa o parameter map e depois depois de executado pega esse mesmo map já com a propriedade marcada com out atualizada.

<parameterMap id="paramsProcTest" class="java.util.Map" >  
        <parameter property="coluna1" mode="IN"/>  
        <parameter property="coluna2" mode="OUT"/>  
    </parameterMap>
    
	<procedure id="myProcTest" parameterMap="paramsProcTest">
        {call PROCEDURE1(?, ?)}  
    </procedure>  
	
	Map map = new HashMap();
	map.put("coluna1", 1);
	
	sqlMapClient.queryForObject("tabela.myProcTest", map);
	
	//agora quando vc pega o map já está a propriedade coluna2 alterada
	
	String retorno = map.get("coluna2");
felipempantoja

Exatamente isso, funcionou! Valeu cara.
Mas tem uma coisa, e se fosse um caso, onde meu parâmetro fosse de um objeto e meu retorno fosse de outro?
Pq nesse caso aí, eu passo um map como parametro e recebo um map como resultado, se eu quisesse passar um map como parametro e receber um objeto User por exemplo, da minha regra de negócios?

B

tente colocar o class do parameter map para a classe que vc quer carregar, e mapeie como out as respectivas propriedades.

felipempantoja

Valeu a ajuda cara.
Então, isso blz, já estou fazendo. O problema é como recuperar esse objeto carregado.
Olha como estou carregando o meu map:

sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap);

Engraçado que depois que eu chamo esse método, ele carrega o meu map “parameterMap” com todos os atributos de saída da minha proc.
Eu queria carregar o meu bean, mas não consegui nem fazendo cast e nem passando como parâmetro como no map acima.

sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap, meuBean); MeuBean meuBean = (MeuBean) sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap);

Onde será que está o erro?

B
felipempantoja:
sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap, meuBean);
MeuBean meuBean = (MeuBean) sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap);
Onde será que está o erro?

o que eu estava falando era isso:

public MeuBean verificarElegibilidade(MeuBean meuBean) throws Exception {

    sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", meuBean);

   return meuBean; //ja volta atualizado.

}

o problema é que em procedures os parâmetros também podem ser uma saida (um retorno, marcado com OUT):

CREATE OR REPLACE PROCEDURE PROCEDURE1 ( param1 IN NUMBER, param2 OUT VARCHAR2) AS

eu duvido muito, mas quem sabe, vc poderia colocar um result map só para as propriedades OUT e deixar no parameter map só as propriedades IN. Não sei se funciona, é só uma sugestão.

felipempantoja

Entendi, vou fazer um teste.
Valeu a ajuda cara… qualquer coisa eu posto aqui de novo.

Abraços.

Criado 10 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 9
Participantes 3