Utilizando Criteria, é possível atribuir mais de uma condição numa associação LeftJoin?
Sempre que utilizo Criteria para fazer a associação, a mesma é feita diretamente pelo id do campo, mas eu precisaria adicionar um OR à condição.
Atualmente, minha consulta acaba ficando assim:
SELECT prod.* FROM produtos prod LEFT JOIN produtos pai ON pai.cd_produto = prod.cd_produto_superior
No entanto, eu preciso que fique desta forma:
SELECT prod.* FROM produtos prod LEFT JOIN produtos pai ON ( prod.cd_produto_superior IS NULL OR pai.cd_produto = prod.cd_produto_superior )
Já pesquisei muito há respeito, li a documentação, e não encontrei absolutamente nada para este caso. Alguém tem alguma ideia? Obrigado.
Bruno, vc poderia postar o código do objeto Produto e o Criteria que você está montando para gerar essa sua consulta atual?
Não mexo com consultas usando criteria há um bom tempo, mas acredito que eu possa te ajudar com isso.
EDIT:
além disso, poderia explicar melhor o que exatamente você quer que sua consulta retorne?
Digo, essa 2a consulta que você postou (a consulta desejada) dá exatamente o mesmo resultado que um simples " select prod.* from produtos prod", não?
A única coisa que preciso é adicionar uma condição à cláusula de junção da consulta. É só olhar as duas consultas para notar que a diferença deve ocorrer após o LeftJoin.
A minha classe, de forma simplificada, está assim:
[code]public class Produto implements Serializable {
private int id;
private String nome;
private Produto pai;
private List< Produto > filhos;
@Column( name = "cd_produto" )
@GeneratedValue
@Id
public int getId() { return id; }
public void setId( int id ) { this.id = id; }
@Column( name = "nm_produto" )
public String getNome() { return nome; }
public void setNome( String nome ) { this.nome = nome; }
@JoinColumn( name = "cd_produto_superior" )
@ManyToOne( fetch = FetchType.LAZY, cascade = CascadeType.ALL )
public Produto getPai() { return pai; }
public void setPai( Produto pai ) { this.pai = pai; }
@JoinColumn( name = "cd_produto_superior" )
@OneToMany( fetch = FetchType.LAZY )
public List< Produto > getFilhos() { return filhos; }
public void setFilhos( List< Produto > filhos ) { this.filhos = filhos; }
Bom, me perdoe se eu estiver viajando.
O resultado que você espera é equivalente ao que você teria com o seguinte criteria
Criteria crit = sess.createCriteria( Produto.class, “prod” );
caso seu fetch no campo pai da classe Produto fosse FetchType.EAGER, isso?
Trocar esse "crit.createCriteria( “prod.pai”, “pai”, CriteriaSpecification.LEFT_JOIN ); " por um “crit.setFetchMode(…,…);” não resolveria o seu problema?
Reforço novamente o que disse no início: me perdoe se eu estiver viajando.
Valeu pela tentativa de ajuda, mas acho que está viajando sim.
O que eu preciso não é modificar a forma de join. O que eu preciso é simplesmente adicionar uma cláusula condicional à cláusula de junção (que o Hibernate gera como padrão para fazer a associação).
Bom, exatamente isso que você está pedindo (uma cláusula adicional no Left Join) realmente eu não sei como fazer.
Pra dificultar ainda mais, não estou com nenhuma aplicação que use hibernate rodando na minha máquina, então fica complicado de fazer para verificar se funciona, e só depois postar.
Mas agora resolver isso é questão de honra (e de diversão, pelo desafio de domar o terrível hibernate)
Bruno, vamos voltar ao começo.
Você poderia me explicar, em palavras, o que você precisa fazer?
é algo como
criteria.add(Restrictions.isNull("cd_produto_superior "));
tem um negócio de conjunction e disjunction tb q eu não me lembro agora mas que serio o “e” e o “ou”