iBatis + Procs == Problemas

Olá pessoal. :smiley:

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>

[code]//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);[/code]

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. :frowning:

Ninguém? =/

Não seria essa chamada que esta errada:

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

O id da procedure no mapeamto é:

myProcTest

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

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.

[code]


<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");[/code]

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?

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

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?

[quote=felipempantoja]

sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap, meuBean); MeuBean meuBean = (MeuBean) sqlMapClient.queryForObject("elegibilidade.verificaElegibilidade", parameterMap);
Onde será que está o erro?[/quote]

o que eu estava falando era isso:

[code]public MeuBean verificarElegibilidade(MeuBean meuBean) throws Exception {

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

return meuBean; //ja volta atualizado.

}[/code]

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

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.

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

Abraços.