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

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

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:

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:

[code]class Documento1 {
(…)
@OneToMany(mappedBy = “documento1”, fetch = FetchType.LAZY)
@Where(clause = “DOC2_SITUACAO = ‘ATIVO’”)
private List<Documento2> documento2s;

public List&lt;Documento2&gt; getDocumento2s() {
	return documento2s;
}

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

(…)
}[/code]

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

[code]class Documento2 {
(…)
@ManyToOne
@JoinColumn(name = “DOC1_ID”)
private Documento1 documento1;

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

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

(…)
}[/code]

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 :slight_smile:

[quote=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!

[/quote]

Eu tb demorei para entender que era um sql rsrs

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