AND dinâmico com MyBatis

1 resposta Resolvido
springsqljava
lucas.sampaio

Bem, pessoal, eu estou a aprender MyBatis e estou desenvolvendo um pequeno programa pra gerir tickets - chamados pra resolver problemas alheios - e senti a necessidade de fazer um AND dinâmico, ou seja, pesquisar por um ou vários valores.

Na documentalção tem o seguinte exemplo:

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <trim prefix="WHERE" prefixOverrides="AND |OR ">
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </trim>
</select>

Porém, tem um problema. Se eu optar por buscar por título ou por autor - usando os atributos do exemplo acima - eu vou ter uma query errada.

SELECT * FROM BLOG WHERE AND title like #{title}

Peço ajuda pra poder montar esse código, gastei um final de semana inteiro e não consegui. Ou seja, colocar o AND apenas se tiver mais de um atributo.

1 Resposta

lucas.sampaio
Solucao aceita

O atributo prefixOverrides da tag trim já faz isso - o AND dinâmico. O problema é que o meu id tava como tipo primitivo - int - e eu não tava testando se era maior que 0 (zero). Estava testando apenas se era diferente de nulo (!= null) e por isso não tava funcionando - não como o esperado. O meu script tava assim:

SELECT t.cod, t.motivo, t.detalhes, t.data_cadastro, t.data_finalizacao 
  <trim prefix="WHERE" prefixOverrides="AND |OR ">
    <if test="cod != null">
      cod = #{cod} ",
    </if>
    <if test="data_cadastro != null">
      AND data_cadastro = #{data_cadastro}
    </if>
  </trim>
</select>

Aí a query estava sendo escrita:

SELECT t.cod, t.motivo, t.detalhes, t.data_cadastro,
t.data_finalizacao  FROM pg.tb_ticket t 
WHERE cod = 0 AND data_cadastro = '2019-09-15 11:46:35';

Ao invés de somente:

SELECT t.cod, t.motivo, t.detalhes, t.data_cadastro,
t.data_finalizacao  FROM pg.tb_ticket t 
WHERE data_cadastro = '2019-09-15 11:46:35';

Moral da história: Usem o debugger.

Criado 27 de setembro de 2019
Ultima resposta 27 de set. de 2019
Respostas 1
Participantes 1