JPA - NamedQueries - Select com LEFT JOIN

6 respostas
R

Boa Tarde

Preciso fazer um select externo para com o seu resultado fazer um left join, mas isso com JPA…

A query no sql puro com DB2 roda certo

select evento.NR_EVT_MNFC as "sequencial", evento.CD_GR_EVT as "grupoEvento", evento.CD_INST_GST_EVT as "instGestora", evento.CD_DEPE_GST_EVT as "depeGestora", evento.CD_TIP_FML as "tipoFormulario", evento.NM_EVT_MNFC as "nome", evento.CD_OUVD_RSP_EVT as "ouvidDominio", evento.CD_TIP_QLC as "tipQualif" , itvt.cd_depe_itvt as "depeSolucao", itvt.cd_inst_itvt as "instSolucao" from evt_mnfc as evento left join (select nr_evt_mnfc, cd_depe_itvt, cd_inst_itvt from itvt_evt where cd_tip_itvt = 3) itvt on evento.nr_evt_mnfc = itvt.nr_evt_mnfc where evento.IN_EVT_MNFC_ATI = 'S' and evento.CD_TIP_QLC = 2 order by evento.NM_EVT_MNFC

Agora transcrevendo para JPA não rola… ele reclama do meu (SELECT) depois do LEFT JOIN FETCH

query= "SELECT evt, itvt FROM EventoManifestacao evt LEFT JOIN FETCH (SELECT itvt.id.numeroEventoManifestacao, itvt.id.codigoDependenciaInterveniente, itvt.id.codigoInstituicaoInterveniente FROM intervenienteEvento where itvt.id.codigoTipoInterveniente = 3) itvt WHERE evt.codigoTipoQualificacao = 2 AND evt.indicadorEventoManifestacaoAtivo = 'S' ORDER BY evt.nomeEventoManifestacao")})

ERRO gerado

Alguém pode me ajudar???

Agradeço!!!

6 Respostas

dev.rafael

Eu ñ entendi. Se já estava funcionando qual o problema?

PS.: Use tags [code] p/ postar o seu código.

R

Bom dia…

Na verdade … funciona em um outro sistema… todas as consultas feitas com SQL na mão… agora estamos mudando toda a estrutura do sistema… saindo do Struts com DAO’s em que usamos sql puro, na mão para usar JBoss Seam e usaremos JPA para persistência. Por isso a pergunta de como refazer o SQL para adptar a JPA.

Ok… usarei a tag… como é meu primeiro post ainda não olhei os recursos disponíveis…

Valeu

dev.rafael

Mostra ai o modelo das classes e a consulta q vc quer fazer q eu te dou uma força. Só p/ lembrar, em JPA vc sempre pode lançar mão da NativeQueries quando a consulta for muito complexa ou mesmo impossível de ser feita em JPQL. É claro q ñ devem ser extensivamente aplicadas mas usa-las p/ resolver alguns problemas e em conjunto com o recurso de NamedQueries é perfeitamente aceitável, além de poder ser uma solução imediata se vc estiver empacado nesse problema.

R

Olha só:

Eu tenho um relacionamento 1:N entre EventoManifestacao e IntervenienteEvento.

O bicho tá pegando quanto tenho que fazer o Select do LEFT JOIN. Eu tenho que pegar o resultado desse select e depois fazer o JOIN com ele. Assim é feito no SQL abaixo:

É... eu pensei no esquema da NativeQueries .... só que pensei que ficaria amarrado ao banco a implementação do SQL... com o @NamedQueries tiraria um pouco desse vinculo com o BD. Mas como é bem difícil que o BD mude, caso não tenha jeito, farei com o Native então...

Valeu ai pela ajuda e atenção.

select    
     evento.NR_EVT_MNFC     as "sequencial",   
     evento.CD_GR_EVT               as "grupoEvento",   
     evento.CD_INST_GST_EVT    as "instGestora",   
     evento.CD_DEPE_GST_EVT    as "depeGestora",   
     evento.CD_TIP_FML              as "tipoFormulario",   
     evento.NM_EVT_MNFC     as "nome",  
         evento.CD_OUVD_RSP_EVT   as "ouvidDominio",  
         evento.CD_TIP_QLC              as "tipQualif" ,  
         itvt.cd_depe_itvt                   as "depeSolucao",  
         itvt.cd_inst_itvt                     as "instSolucao"  
 from   
     evt_mnfc as evento left join (select nr_evt_mnfc, cd_depe_itvt, cd_inst_itvt from itvt_evt where cd_tip_itvt = 3) itvt  
         on evento.nr_evt_mnfc = itvt.nr_evt_mnfc  
 where  
     evento.IN_EVT_MNFC_ATI = 'S' and  
         evento.CD_TIP_QLC = 2  
 order by   
     evento.NM_EVT_MNFC
EventoManifestacao.class
public class EventoManifestacao implements java.io.Serializable
{

	private int	 							numeroEventoManifestacao;
	private short   						codigoGrupoEvento;
	private Integer 						codigoInstituicaoGestorEvento;
	private Integer 						codigoDependenciaGestorEvento;
	private short   						codigoTipoFormulario;
	private String  						nomeEventoManifestacao;
	private short   						quantidadeDiaSolucaoManifestacao;
	private char							indicadorVisualizacaoRestritoAdministrador;
	private char							indicadorSuperintendenciaResponsavelSolucao;
	private char							indicadorEventoManifestacaoAtivo;
	private char							indicadorAcompanhamentoSuperintendencia;
	private Integer 						codigoOuvidoriaResponsavelEvento;
	private short   						codigoTipoQualificacao;
	private Set <IntervenienteEvento> 		intervenienteEvento;
	
	private GrupoEventoManifestacao 		grupoEventoManifestacao;

	public EventoManifestacao()
	{}

	public EventoManifestacao(int numeroEventoManifestacao, short codigoGrupoEvento, short codigoTipoFormulario,
			String nomeEventoManifestacao, short quantidadeDiaSolucaoManifestacao,
			char indicadorVisualizacaoRestritoAdministrador, char indicadorSuperintendenciaResponsavelSolucao,
			char indicadorEventoManifestacaoAtivo, char indicadorAcompanhamentoSuperintendencia,
			short codigoTipoQualificacao)
	{
		this.numeroEventoManifestacao = numeroEventoManifestacao;
		this.codigoGrupoEvento = codigoGrupoEvento;
		this.codigoTipoFormulario = codigoTipoFormulario;
		this.nomeEventoManifestacao = nomeEventoManifestacao;
		this.quantidadeDiaSolucaoManifestacao = quantidadeDiaSolucaoManifestacao;
		this.indicadorVisualizacaoRestritoAdministrador = indicadorVisualizacaoRestritoAdministrador;
		this.indicadorSuperintendenciaResponsavelSolucao = indicadorSuperintendenciaResponsavelSolucao;
		this.indicadorEventoManifestacaoAtivo = indicadorEventoManifestacaoAtivo;
		this.indicadorAcompanhamentoSuperintendencia = indicadorAcompanhamentoSuperintendencia;
		this.codigoTipoQualificacao = codigoTipoQualificacao;
	}

	public EventoManifestacao(int numeroEventoManifestacao, short codigoGrupoEvento,
			Integer codigoInstituicaoGestorEvento, Integer codigoDependenciaGestorEvento, short codigoTipoFormulario,
			String nomeEventoManifestacao, short quantidadeDiaSolucaoManifestacao,
			char indicadorVisualizacaoRestritoAdministrador, char indicadorSuperintendenciaResponsavelSolucao,
			char indicadorEventoManifestacaoAtivo, char indicadorAcompanhamentoSuperintendencia,
			Integer codigoOuvidoriaResponsavelEvento, short codigoTipoQualificacao)
	{
		this.numeroEventoManifestacao = numeroEventoManifestacao;
		this.codigoGrupoEvento = codigoGrupoEvento;
		this.codigoInstituicaoGestorEvento = codigoInstituicaoGestorEvento;
		this.codigoDependenciaGestorEvento = codigoDependenciaGestorEvento;
		this.codigoTipoFormulario = codigoTipoFormulario;
		this.nomeEventoManifestacao = nomeEventoManifestacao;
		this.quantidadeDiaSolucaoManifestacao = quantidadeDiaSolucaoManifestacao;
		this.indicadorVisualizacaoRestritoAdministrador = indicadorVisualizacaoRestritoAdministrador;
		this.indicadorSuperintendenciaResponsavelSolucao = indicadorSuperintendenciaResponsavelSolucao;
		this.indicadorEventoManifestacaoAtivo = indicadorEventoManifestacaoAtivo;
		this.indicadorAcompanhamentoSuperintendencia = indicadorAcompanhamentoSuperintendencia;
		this.codigoOuvidoriaResponsavelEvento = codigoOuvidoriaResponsavelEvento;
		this.codigoTipoQualificacao = codigoTipoQualificacao;
	}

	@Id
	@Column(name = "NR_EVT_MNFC", unique = true, nullable = false)
	@NotNull
	public int getNumeroEventoManifestacao()
	{
		return this.numeroEventoManifestacao;
	}

	public void setNumeroEventoManifestacao(int numeroEventoManifestacao)
	{
		this.numeroEventoManifestacao = numeroEventoManifestacao;
	}

	@Column(name = "CD_GR_EVT", nullable = false)
	@NotNull
	public short getCodigoGrupoEvento()
	{
		return this.codigoGrupoEvento;
	}

	public void setCodigoGrupoEvento(short codigoGrupoEvento)
	{
		this.codigoGrupoEvento = codigoGrupoEvento;
	}

	@Column(name = "CD_INST_GST_EVT")
	public Integer getCodigoInstituicaoGestorEvento()
	{
		return this.codigoInstituicaoGestorEvento;
	}

	public void setCodigoInstituicaoGestorEvento(Integer codigoInstituicaoGestorEvento)
	{
		this.codigoInstituicaoGestorEvento = codigoInstituicaoGestorEvento;
	}

	@Column(name = "CD_DEPE_GST_EVT")
	public Integer getCodigoDependenciaGestorEvento()
	{
		return this.codigoDependenciaGestorEvento;
	}

	public void setCodigoDependenciaGestorEvento(Integer codigoDependenciaGestorEvento)
	{
		this.codigoDependenciaGestorEvento = codigoDependenciaGestorEvento;
	}

	@Column(name = "CD_TIP_FML", nullable = false)
	@NotNull
	public short getCodigoTipoFormulario()
	{
		return this.codigoTipoFormulario;
	}

	public void setCodigoTipoFormulario(short codigoTipoFormulario)
	{
		this.codigoTipoFormulario = codigoTipoFormulario;
	}

	@Column(name = "NM_EVT_MNFC", nullable = false, length = 100)
	@NotNull
	@Length(max = 100)
	public String getNomeEventoManifestacao()
	{
		return this.nomeEventoManifestacao;
	}

	public void setNomeEventoManifestacao(String nomeEventoManifestacao)
	{
		this.nomeEventoManifestacao = nomeEventoManifestacao;
	}

	@Column(name = "QT_DD_SLC_MNFC", nullable = false)
	@NotNull
	public short getQuantidadeDiaSolucaoManifestacao()
	{
		return this.quantidadeDiaSolucaoManifestacao;
	}

	public void setQuantidadeDiaSolucaoManifestacao(short quantidadeDiaSolucaoManifestacao)
	{
		this.quantidadeDiaSolucaoManifestacao = quantidadeDiaSolucaoManifestacao;
	}

	@Column(name = "IN_VSLO_RSTT_ADM", nullable = false, length = 1)
	@NotNull
	public char getIndicadorVisualizacaoRestritoAdministrador()
	{
		return this.indicadorVisualizacaoRestritoAdministrador;
	}

	public void setIndicadorVisualizacaoRestritoAdministrador(char indicadorVisualizacaoRestritoAdministrador)
	{
		this.indicadorVisualizacaoRestritoAdministrador = indicadorVisualizacaoRestritoAdministrador;
	}

	@Column(name = "IN_SPCA_RSP_SLC", nullable = false, length = 1)
	@NotNull
	public char getIndicadorSuperintendenciaResponsavelSolucao()
	{
		return this.indicadorSuperintendenciaResponsavelSolucao;
	}

	public void setIndicadorSuperintendenciaResponsavelSolucao(char indicadorSuperintendenciaResponsavelSolucao)
	{
		this.indicadorSuperintendenciaResponsavelSolucao = indicadorSuperintendenciaResponsavelSolucao;
	}

	@Column(name = "IN_EVT_MNFC_ATI", nullable = false, length = 1)
	@NotNull
	public char getIndicadorEventoManifestacaoAtivo()
	{
		return this.indicadorEventoManifestacaoAtivo;
	}

	public void setIndicadorEventoManifestacaoAtivo(char indicadorEventoManifestacaoAtivo)
	{
		this.indicadorEventoManifestacaoAtivo = indicadorEventoManifestacaoAtivo;
	}

	@Column(name = "IN_ACPT_SPCA", nullable = false, length = 1)
	@NotNull
	public char getIndicadorAcompanhamentoSuperintendencia()
	{
		return this.indicadorAcompanhamentoSuperintendencia;
	}

	public void setIndicadorAcompanhamentoSuperintendencia(char indicadorAcompanhamentoSuperintendencia)
	{
		this.indicadorAcompanhamentoSuperintendencia = indicadorAcompanhamentoSuperintendencia;
	}

	@Column(name = "CD_OUVD_RSP_EVT")
	public Integer getCodigoOuvidoriaResponsavelEvento()
	{
		return this.codigoOuvidoriaResponsavelEvento;
	}

	public void setCodigoOuvidoriaResponsavelEvento(Integer codigoOuvidoriaResponsavelEvento)
	{
		this.codigoOuvidoriaResponsavelEvento = codigoOuvidoriaResponsavelEvento;
	}

	@Column(name = "CD_TIP_QLC", nullable = false)
	@NotNull
	public short getCodigoTipoQualificacao()
	{
		return this.codigoTipoQualificacao;
	}

	public void setCodigoTipoQualificacao(short codigoTipoQualificacao)
	{
		this.codigoTipoQualificacao = codigoTipoQualificacao;
	}
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "CD_GR_EVT", nullable = false,insertable=false,updatable=false)
	@NotNull
	public GrupoEventoManifestacao getGrupoEventoManifestacao() {
		return grupoEventoManifestacao;
	}

	public void setGrupoEventoManifestacao(
			GrupoEventoManifestacao grupoEventoManifestacao) {
		this.grupoEventoManifestacao = grupoEventoManifestacao;
	}
	
	@OneToMany(mappedBy="eventoManifestacao",fetch=FetchType.LAZY)
	public Set<IntervenienteEvento> getIntervenienteEvento() {
		return intervenienteEvento;
	}

	public void setIntervenienteEvento(Set<IntervenienteEvento> intervenienteEvento) {
		this.intervenienteEvento = intervenienteEvento;
	}

}

IntervenienteEvento.class

public class IntervenienteEvento implements java.io.Serializable
{

	private IntervenienteEventoId id;
	//
	private EventoManifestacao eventoManifestacao;

	public IntervenienteEvento()
	{}

	public IntervenienteEvento(IntervenienteEventoId id)
	{
		this.id = id;
	}

	@EmbeddedId
	@AttributeOverrides(
	{
			@AttributeOverride(name = "numeroEventoManifestacao", column = @Column(name = "NR_EVT_MNFC", nullable = false)),
			@AttributeOverride(name = "codigoTipoInterveniente", column = @Column(name = "CD_TIP_ITVT", nullable = false)),
			@AttributeOverride(name = "codigoDependenciaInterveniente", column = @Column(name = "CD_DEPE_ITVT", nullable = false)),
			@AttributeOverride(name = "codigoInstituicaoInterveniente", column = @Column(name = "CD_INST_ITVT", nullable = false)) })
	@NotNull
	public IntervenienteEventoId getId()
	{
		return this.id;
	}

	public void setId(IntervenienteEventoId id)
	{
		this.id = id;
	}

	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="NR_EVT_MNFC", nullable=false, insertable=false, updatable=false)
	public EventoManifestacao getEventoManifestacao() {
		return eventoManifestacao;
	}

	public void setEventoManifestacao(EventoManifestacao eventoManifestacao) {
		this.eventoManifestacao = eventoManifestacao;
	}
	
}

IntervenienteEventoId.class

@Embeddable
public class IntervenienteEventoId implements java.io.Serializable
{

	private int   numeroEventoManifestacao;
	private short codigoTipoInterveniente;
	private int   codigoDependenciaInterveniente;
	private int   codigoInstituicaoInterveniente;

	public IntervenienteEventoId()
	{}

	public IntervenienteEventoId(int numeroEventoManifestacao, short codigoTipoInterveniente,
			int codigoDependenciaInterveniente, int codigoInstituicaoInterveniente)
	{
		this.numeroEventoManifestacao = numeroEventoManifestacao;
		this.codigoTipoInterveniente = codigoTipoInterveniente;
		this.codigoDependenciaInterveniente = codigoDependenciaInterveniente;
		this.codigoInstituicaoInterveniente = codigoInstituicaoInterveniente;
	}

	@Column(name = "NR_EVT_MNFC", nullable = false)
	@NotNull
	public int getNumeroEventoManifestacao()
	{
		return this.numeroEventoManifestacao;
	}

	public void setNumeroEventoManifestacao(int numeroEventoManifestacao)
	{
		this.numeroEventoManifestacao = numeroEventoManifestacao;
	}

	@Column(name = "CD_TIP_ITVT", nullable = false)
	@NotNull
	public short getCodigoTipoInterveniente()
	{
		return this.codigoTipoInterveniente;
	}

	public void setCodigoTipoInterveniente(short codigoTipoInterveniente)
	{
		this.codigoTipoInterveniente = codigoTipoInterveniente;
	}

	@Column(name = "CD_DEPE_ITVT", nullable = false)
	@NotNull
	public int getCodigoDependenciaInterveniente()
	{
		return this.codigoDependenciaInterveniente;
	}

	public void setCodigoDependenciaInterveniente(int codigoDependenciaInterveniente)
	{
		this.codigoDependenciaInterveniente = codigoDependenciaInterveniente;
	}

	@Column(name = "CD_INST_ITVT", nullable = false)
	@NotNull
	public int getCodigoInstituicaoInterveniente()
	{
		return this.codigoInstituicaoInterveniente;
	}

	public void setCodigoInstituicaoInterveniente(int codigoInstituicaoInterveniente)
	{
		this.codigoInstituicaoInterveniente = codigoInstituicaoInterveniente;
	}

	public boolean equals(Object other)
	{
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof IntervenienteEventoId))
			return false;
		IntervenienteEventoId castOther = (IntervenienteEventoId) other;

		return (this.getNumeroEventoManifestacao() == castOther.getNumeroEventoManifestacao())
				&& (this.getCodigoTipoInterveniente() == castOther.getCodigoTipoInterveniente())
				&& (this.getCodigoDependenciaInterveniente() == castOther.getCodigoDependenciaInterveniente())
				&& (this.getCodigoInstituicaoInterveniente() == castOther.getCodigoInstituicaoInterveniente());
	}

	public int hashCode()
	{
		int result = 17;

		result = 37 * result + this.getNumeroEventoManifestacao();
		result = 37 * result + this.getCodigoTipoInterveniente();
		result = 37 * result + this.getCodigoDependenciaInterveniente();
		result = 37 * result + this.getCodigoInstituicaoInterveniente();
		return result;
	}

}
dev.rafael

Ñ se o JPA2 mudou mas, se ñ me engano, o JPA1 ñ suporta queries aninhadas. O q, a primeira vista, exclui o JPA como opção p/ solução desse problema. Vc provavelmente devia usar uma Query nativa. Isso ñ é exatamente um problema pois tipicamente bancos duram mais q aplicações. Além disso vc pode mesclar queries nativas com NamedQuery através das NamedNativeQueries. Com isso vc centraliza todas as suas queries nativas nas suas classes de entidade, o q vai facilitar muito a migração de bancos, caso isso venha a acontecer um dia. E ainda continuará livre da obrigação de criar DAOs p conta das queries nativas pois ainda vai tirar vantagem da interface do EntityManager.

R

dev.rafael

Valeu ai pela orientação e ajuda.
Vou agora fazer com a NamedNativeQueries.
Vamos aos teste…

Valeu

Criado 13 de outubro de 2010
Ultima resposta 14 de out. de 2010
Respostas 6
Participantes 2