2
respostas

JPA-HIBERNATE : Eu entendi as conjuncoes e disjuncoes ? É isso mesmo?

Peguei umas apostilas de JPA e li alguns tutoriais na internet, mas estou ainda um pouco perdido com relação a disjunction e conjunction no JPA.

Pelo que eu entendi a conjuncao serve para agrupar condições com o "AND" do sql, já a disjuncao serve para agrupar condições com "OR". Estou certo? O material que pesquisei me parece muito confuso.

Tentei entao fazer o criteria gerar queries com o seguinte padrao:

WHERE (condicao1 = valor1 AND condicao2 = valor2) or (condicao3=valor3 and condicao4=valor4)

O que me deixou confuso é que quando crio uma nova conjuncao e adiciono duas condições a ela, apenas a segunda condição aparece dentro de parenteses. Nao entendi o criterio que leva o JPA a adicionar a segunda predict dentro de parenteses.

Ex:

        Predicate conjuncao2 = criteriaBuilder.conjunction();
        conjuncao2 = criteriaBuilder.and(conjuncao2,idIgual);
        conjuncao2 = criteriaBuilder.and(conjuncao2,titularIgual);

Minha intenção com esse código seria gerar algo como :

WHERE 1=1 AND Conta.id = ?  AND Conta.titular = ?

Entretanto, por algum motivo a minha conjuncao resulta em:

WHERE 1=1 AND Conta.id = ? AND (Conta.titular = ?)

Porque isso acontece? E se eu estivesse interessado em fazer condições compostas como :

WHERE (Conta.id = ? and Conta.titular = ?) AND (Conta.banco = ? and Conta.titular = ?)
2 respostas

Boa pergunta.. o motivo dos parênteses eu não sei ao certo, precisaria dar uma olhada melhor. Entretanto, eles aí não parecem fazer diferença.. mesmo na composta.. uma condição falsa faria tudo ficar falso.

Acho que tá mais com cara de detalhe de implementação do hibernate, talvez se testar com o eclipselink, a query gerada já seja diferente.. o que não importa, dado que o resultado seja o mesmo.