Passar nome da tabela como parametro em uma NamedNativeQuery

3 respostas
marcelomello

Olá pessoal,

É o seguinte, com certeza não deve ser a melhor maneira o que eu quero fazer, mas no momento gostaria que fosse assim.
Em um caso aqui tenho uma entidade, e nela tenho umas 5 NamedNativeQueries, abaixo segue exemplo:

@NamedNativeQueries(
{
	@NamedNativeQuery(
		name="getDadosPrecipitacao",
		query=" Select "
			+ "		vm.cd_estac_agromet, vm.cd_var_leitura, vm.dt_hora_leitura, vm.vl_dado_1, 0 as vl_dado_2, 0 as vl_dado_3, 0 as vl_dado_4, 0 as vl_dado_5 " 
	        + "	From :tableOrView vm, sam.estac_agromet ea "
	        + "	Where vm.cd_estac_agromet = :idEstacao "
	        + "	And vm.cd_estac_agromet = ea.cd_estac_agromet "
	        + "	And vm.cd_var_leitura = decode(ea.nr_tp_estac_agromet,2,27,1,8) "
	        + "	And vm.dt_hora_leitura > decode(ea.nr_tp_estac_agromet,2,sysdate-:nDias,1,sysdate-:nDiasConvencional) "
	        + "	Order by vm.dt_hora_leitura ",
        resultSetMapping = "DadosVariaveis"
	),
	@NamedNativeQuery(
		name="getDadosTemperatura",
		query=" Select "
			+ "		vm.cd_estac_agromet, vm.cd_var_leitura, vm.dt_hora_leitura, " 
			+ "		decode(ea.nr_tp_estac_agromet,2,vm1.vl_dado_1,1,null) as vl_dado_1, " 
			+ "		decode(ea.nr_tp_estac_agromet,2,vm1.vl_dado_2,1,vm1.vl_dado_3) as vl_dado_2, " 
			+ "		decode(ea.nr_tp_estac_agromet,2,vm2.vl_dado_1,1,vm1.vl_dado_1) as vl_dado_3, " 
			+ "		decode(ea.nr_tp_estac_agromet,2,vm2.vl_dado_3,1,vm1.vl_dado_2) as vl_dado_4 " 
			+ "	From :tableOrView vm1, :tableOrView vm2, sam.estac_agromet ea "
			+ "	Where vm1.cd_estac_agromet = :idEstacao "
			+ "	And vm1.cd_estac_agromet = ea.cd_estac_agromet "
			+ "	And vm1.cd_estac_agromet = vm2.cd_estac_agromet "
			+ "	And vm1.cd_var_leitura = decode(ea.nr_tp_estac_agromet,2,19,1,3) "
			+ "	And vm2.cd_var_leitura = decode(ea.nr_tp_estac_agromet,2,20,1,3) "
			+ "	And vm1.dt_hora_leitura > decode(ea.nr_tp_estac_agromet,2,sysdate-:nDias,1,sysdate-:nDiasConvencional) "
			+ "	And vm1.dt_hora_leitura = vm2.dt_hora_leitura "
			+ "	Order by vm.dt_hora_leitura ",
		resultSetMapping = "DadosVariaveis"
	)
})

Meu problema está aqui neste parametro --> :tableOrView

Gostaria de passar como parâmetro o nome da tabela/view, pois em alguns casos irei fazer consulta em uma tabela em outro em uma view.
Alguém já passou por isso? Tem como passar uma solução?

Obrigado,

Marcelo

3 Respostas

Hebert_Coelho

Até onde eu já pesquisei não tem como.

Você teria que criar uma native query na hora mesmo e não utilizar a native.

marcelomello

huummm, o que vc quer dizer é que ao invés de deixar elas nomeadas na entidade criar no DAO, certo ?!

Hebert_Coelho

marcelomello:
huummm, o que vc quer dizer é que ao invés de deixar elas nomeadas na entidade criar no DAO, certo ?!
Exato.

Você poderia deixá-las como uma String e depois dar um replace antes de fazer o entityManager.createNativeQuery(HHH);

Criado 18 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 3
Participantes 2