Olá:
Eu tenho a seguinte classe:
public class PropriedadeVO {
private Long id;
private String nome;
private String cnpj;
private String nomeMunicipio;
private String codigoUf;
private String status;
private Date dataAlteracao;
private String nomeUsuarioAtualizacao;
private String cpfUsuarioAtualizacao;
private Collection<PessoaVO> pessoasProprietarios;
public PropriedadeVO(Long id, String nome, String cnpj, String nomeMunicipio, String codigoUf, String status,
Date dataAlteracao, String nomeUsuarioAtualizacao, String cpfUsuarioAtualizacao) {
// Preenche os campos
}
// Getter, Setter e outros métodos
}
Eu tenho a seguinte query para preencher os valores de PropriedadeVO:
SELECT new br.gov.sp.prodesp.cda.gedave.base.vo.PropriedadeVO(
p.id, p.nome, pjProp.cnpj, municipio.nome, uf.codigo, status.dominio, p.dataAtualizacao, pfUsuario.nome, pfUsuario.cpf)
FROM PropriedadeORM p
LEFT JOIN p.pessoaJuridica pjProp
JOIN p.enderecoPropriedade endereco
JOIN endereco.municipio municipio
JOIN municipio.uf uf
JOIN p.status status
LEFT JOIN p.usuarioAtualizacao usuario
LEFT JOIN usuario.pessoaFisica pfUsuario
LEFT JOIN usuario.pessoaFisica pfUsuario
ORDER BY p.nome;
E para cada PropriedadeVO preciso realiza a seguinte query para preencher a collecion pessoasProprietarios:
SELECT new br.gov.sp.prodesp.cda.gedave.pessoa.vo.PessoaVO(pf.id, pf.tipoPessoa, pf.nome, pf.cpf)
FROM PessoaFisicaORM pf
WHERE pf IN (
SELECT pp.pessoaProprietario
FROM ProprietarioORM pp
WHERE pp.propriedade.id = :idPropriedade
AND pp.status.codigo <> :codStatusCancelado
AND pp.pessoaProprietario.tipoPessoa = :tipoPessoa
)
AND pf.status.codigo <> :codStatusCancelado
ORDER BY pf.nome
E com isso a produtividade vai para lixo.
Portanto a minha dúvida é se é possível (e como) fazer algum tipo de Join para trazer o itens de pessoasProprietarios junto na query principal.
Uma coisa em que pensei agora (e provavelmente não é possível) é embutir a segunda query dentro do construtor da primeira. Algo como:
SELECT new PropriedadeVO(p.id, p.nome, ..., pfUsuario.cpf,
(SELECT new PessoaVO(pf.id, pf.tipoPessoa, pf.nome, pf.cpf) -- O resultado da query para pessoasProprietarios entra como argumento do construtor.
FROM PessoaFisicaORM pf
WHERE pf IN (
SELECT pp.pessoaProprietario
FROM ProprietarioORM pp
WHERE pp.propriedade.id = :idPropriedade
AND pp.status.codigo <> :codStatusCancelado
AND pp.pessoaProprietario.tipoPessoa = :tipoPessoa
)
AND pf.status.codigo <> :codStatusCancelado
)
)
FROM PropriedadeORM p
LEFT JOIN p.pessoaJuridica pjProp
...
Será que isso funcionaria? Será que não existe algum tipo de anotação JPA que poderia fazer esse mapeamento por mim?
Grato,