[RESOLVIDO] Anotação Hibernate para one-to-one com AND no join

4 respostas
alineea

Bom dia pessoal do GUJ!!
Faz tempo que eu não aparecço, agora venho com um probleminha <=) Eu postei tb no JUG do meu estado, aí quem responder primeiro, eu posto a resposta para os dois (JUG e GUJ)…

Eu tenho este SQL para selecionar registros de documento1, sendo que cada um deles pode ter um documento2:

SELECT d1.*, d2.* FROM documento1 d1 LEFT JOIN documento2 d2 ON d2.d2_ID = d1.d2_ID AND d2.SITUACAO = 'ativo'

Como eu insiro esse AND no meu relacionamento one-to-one?

@Entity public class Documento1 { (...) @OneToOne(mappedBy = &quot;documento1&quot; ) private Documento2 documento2; (...) }

Na verdade no banco eu tenho N documento2 apontando para 1 documento1, mas somente um destes documento2 é ativo, o resto é tudo arquivado. E é só o ativo que interessa para documento1, por isso preciso do relacionamento one-to-one. Não se essa informação ajuda…

Eu estou caçando no Google, mas eu não sei como o SQL denomina esse tipo de join e como o hibernate denomina esse tipo de join tb… Estou tentando…

Agradeço muito as orientações…
Abraço forte

4 Respostas

lelodois

Olá… achei!!!

Deve acrescentar a anotação… adivinha o nome… where, @Where na sua coleção.

@Where(clause = "ativo = 1")

Exemplo:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "solicitante", cascade = {
			CascadeType.MERGE,
			CascadeType.PERSIST,
			CascadeType.REMOVE
	})
	@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@Where(clause = "ativo = 1")
	private List&lt;Solicitacao&gt; solicitacoes = new ArrayList&lt;Solicitacao&gt;();

Só que vc deve se atentar pois este where é com base no banco de dados, é um sql, ou seja, o hibernate não converterá isto em sql, ele simplesmente colocará no select tudo que está definido no clause.

É um sql.

:slight_smile:

alineea

lelodois, muito obrigada! Era isso mesmo que eu precisava...
Na verdade eu antes não tinha entendido e fiz errado, e por isso continuei batendo a cabeça...

Mas prestando mais atenção no que vc falou da SQL do clause, aí entendi!

Para ajudar os amigos, aí vai a solução:

class Documento1 {
(...)
	@OneToMany(mappedBy = "documento1", fetch = FetchType.LAZY)
	@Where(clause = "DOC2_SITUACAO = 'ATIVO'")
	private List&lt;Documento2&gt; documento2s;
 
	public List&lt;Documento2&gt; getDocumento2s() {
		return documento2s;
	}

	public void setDocumento2s(List&lt;Documento2&gt; documento2s) {
		this.documento2s= documento2s;
	}
(...)
}

A classe Documento 2 tava de boa, ela não me interessava muito, já que todo documento2 aponta só para uma documento1:

class Documento2 {
(...)
	@ManyToOne
	@JoinColumn(name = "DOC1_ID")
	private Documento1 documento1;             

	public void setDocumento1 (Documento1  documento1) {
		this.documento1= documento1;
	}

	public Documento1  getDocumento1 () {
		return this.documento1;
	}
(...)
}

O que eu queria com isso era contar os documentos 1 ativos que não tinham documentos 2 ativos apontando para ele. O método ficou assim:

public Long contarDocumentos1SemDocumento2() {
		return (Long) getDao().createQuery(
				"select count(s) from Documento1 d1 where d1.situacao = 'ATIVO' and d1.tipo = PRORROGACAO_PRAZO"
						+ " and d1.documento2s is empty").uniqueResult();
	}

FUNFOU EEEEEEEEEE
ESPERO QUE AJUDE OUTRAS PESSOAS ^^
Muito obrigada a todos :)

lelodois

alineea:
lelodois, muito obrigada! Era isso mesmo que eu precisava…
Na verdade eu antes não tinha entendido e fiz errado, e por isso continuei batendo a cabeça…

Mas prestando mais atenção no que vc falou da SQL do clause, aí entendi!

Eu tb demorei para entender que era um sql rsrs

pissurno

Senhorita Aline

So complementando a anotação @Where é do hibernate então vc acaba ficando preso a ele se vc precisasse fazer isso por exemplo no eclipselink não seria tão fácil assim. :slight_smile:
Já precisei fazer isso uma vez só não me lembro agora como fiz quando lembrar eu posto.

ate

Criado 1 de setembro de 2010
Ultima resposta 13 de set. de 2010
Respostas 4
Participantes 3