Estou escrevendo um aplicativo da Web simples para chamar um procedimento armazenado e recuperar alguns dados. É uma aplicação bastante simples, que interage com a base de dados do cliente. Passamos a id do funcionário e a id da empresa e o procedimento armazenado retornará os detalhes do funcionário.
O aplicativo Web não pode atualizar / excluir dados e está usando o SQL Server.
Estou implantando meu aplicativo da web em Jboss AS. Devo usar JPA para acessar o procedimento armazenado ou CallableStatement
. Qualquer vantagem de usar JPA neste caso.
Além disso, qual será a instrução sql para chamar este procedimento armazenado. Nunca usei stored procedures antes e estou tendo dificuldades com este. O Google não ajudou muito.
Aqui está o procedimento armazenado:
CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
select firstName,
lastName,
gender,
address
from employee et
where et.employeeId = @employeeId
and et.companyId = @companyId
end
Atualizar:
Para qualquer outra pessoa que tenha problemas para chamar o procedimento armazenado usando JPA .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Coisas que notei:
- Nomes de parâmetro não funcionaram para mim, então tente usar o índice de parâmetro.
- Instrução sql correta em
{call sp_name(?,?)}
vez decall sp_name(?,?)
- Se o procedimento armazenado estiver retornando um conjunto de resultados, mesmo se você souber com apenas uma linha,
getSingleResult
não funcionará - Passe um
resultSetMapping
nome ou detalhes de classe de resultado
Respostas:
JPA 2.1 agora oferece suporte a Stored Procedure, leia o documento Java aqui .
Exemplo:
Veja o exemplo detalhado aqui .
fonte
Não é realmente suportado por JPA, mas é factível . Mesmo assim, eu não iria desta forma:
Portanto, prefiro usar o suporte Spring para acesso a dados JDBC , ou um mapeador de dados como MyBatis ou, dada a simplicidade de seu aplicativo, JDBC bruto e
CallableStatement
. Na verdade, JDBC provavelmente seria minha escolha. Aqui está um exemplo básico de lançamento:Referência
fonte
Você precisa passar os parâmetros para o procedimento armazenado.
Deve funcionar assim:
Atualizar:
Ou talvez não devesse.
No Livro EJB3 em Ação , diz na página 383, que JPA não suporta stored procedures (a página é apenas uma prévia, você não obtém o texto completo, o livro inteiro está disponível para download em vários lugares incluindo este , Não sei se isso é legal).
Enfim, o texto é este:
JPA e procedimentos armazenados de banco de dados
fonte
Como recuperar o parâmetro de saída do Stored Procedure usando JPA (2.0 precisa de importações EclipseLink e 2.1 não)
Mesmo que esta resposta elabore sobre o retorno de um conjunto de registros de um procedimento armazenado, estou postando aqui, porque levei muito tempo para descobrir e este tópico me ajudou.
Meu aplicativo estava usando Eclipselink-2.3.1, mas irei forçar uma atualização para Eclipselink-2.5.0, já que JPA 2.1 tem suporte muito melhor para procedimentos armazenados.
Usando EclipseLink-2.3.1 / JPA-2.0: Dependente de Implementação
Este método requer importações de classes EclipseLink de "org.eclipse.persistence", portanto, é específico para a implementação Eclipselink.
Eu o encontrei em " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters ".
Usando EclipseLink-2.5.0 / JPA-2.1: Implementation-Independent (já documentado neste tópico)
Este método é independente da implementação (não precisa de importações do Eclipslink).
fonte
xml
arquivo e não funcionou. Não consigo ler oOUT
parâmetro.Para mim, apenas o seguinte funcionou com Oracle 11g e Glassfish 2.1 (Toplink):
A variante com chaves resultou em ORA-00900.
fonte
Se estiver usando EclipseLink, você pode usar @NamedStoredProcedureQuery ou StoreProcedureCall para executar qualquer procedimento armazenado, incluindo aqueles com parâmetros de saída ou cursores de saída. Suporte para funções armazenadas e tipos de dados PLSQL também estão disponíveis.
Veja, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
fonte
Para um procedimento armazenado simples que usa parâmetros IN / OUT como este
Você pode chamá-lo do JPA da seguinte maneira:
Para um procedimento armazenado que usa um
SYS_REFCURSOR
parâmetro OUT:Você pode chamá-lo da seguinte maneira:
Para uma função SQL semelhante a esta:
Você pode chamá-lo assim:
Ao menos ao usar Hibernate 4.xe 5.x porque o JPA
StoredProcedureQuery
não funciona para FUNÇÕES SQL.Para obter mais detalhes sobre como chamar procedimentos e funções armazenados ao usar JPA e Hibernate, consulte os seguintes artigos
fonte
createNativeQuery
. Eu mudei paracreateStoredProcedureQuery
. Então, voila!O seguinte funciona para mim:
fonte
Pode ser que não seja o mesmo para Sql Srver, mas para pessoas que usam oracle e eclipslink está funcionando para mim
ex: um procedimento que tem um parâmetro IN (tipo CHAR) e dois parâmetros OUT (NUMBER e VARCHAR)
no persistence.xml declare a unidade de persistência:
e declara a estrutura do proc no eclipselink-orm.xml
no código, você só precisa chamar seu proc assim:
para obter os dois parâmetros de saída:
fonte
Isso funcionou para mim.
Nota: no futuro, se você decidir usar a versão padrão de findOne, basta comentar a anotação NamedNativeQueries e o JPA mudará para o padrão
fonte
Esta resposta pode ser útil se você tiver um gerente de entidade
Eu tinha um procedimento armazenado para criar o próximo número e no lado do servidor tenho estrutura de costura.
Lado do cliente
Lado do banco de dados (servidor SQL) Eu armazenei o procedimento denominado
getNextNmber
fonte
JPA 2.0 não suporta valores RETURN, apenas chamadas.
Minha solução foi. Crie uma FUNCTION chamando PROCEDURE.
Então, dentro do código JAVA você executa uma NATIVE QUERY chamando o oracle FUNCTION.
fonte
Para chamar o procedimento armazenado, podemos usar a instrução Callable no pacote java.sql.
fonte
Experimente este código:
fonte
Você pode usar
@Query(value = "{call PROC_TEST()}", nativeQuery = true)
em seu repositório. Isso funcionou para mim.Atenção: use '{' e '}' ou então não funcionará.
fonte
persistence.xml
codigo java
fonte
A partir do JPA 2.1, o JPA suporta a chamada de procedimentos armazenados usando StoredProcedureQuery dinâmico e o declarativo @NamedStoredProcedureQuery.
fonte
Minha solução foi. Crie uma FUNCTION chamando PROCEDURE.
Então, dentro do código JAVA você executa uma NATIVE QUERY chamando o oracle FUNCTION.
fonte