L'appel correctement fonctions PostgreSQL (procédures stockées) dans Spring/Hibernate/JPA?
Je suis à l'aide de Spring MVC 4, Hibernate et PostgreSQL 9.3 et ont défini la fonction (procédure stockée) à l'intérieur de Postgres comme ceci:
CREATE OR REPLACE FUNCTION spa.create_tenant(t_name character varying)
RETURNS void AS
$BODY$
BEGIN
EXECUTE format('CREATE SCHEMA IF NOT EXISTS %I AUTHORIZATION postgres', t_name);
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION spa.create_tenant(character varying)
OWNER TO postgres;
Si je lance cette fonction à l'intérieur de pgAdmin comme cela ça fonctionne:
select spa.create_tenant('somename');
Maintenant j'essaie de l'exécuter cette fonction à partir de mon service comme celui-ci:
@Override
@Transactional
public void createSchema(String name) {
StoredProcedureQuery sp = em.createStoredProcedureQuery("spa.create_tenant");
sp.registerStoredProcedureParameter("t_name", String.class, ParameterMode.IN);
sp.setParameter("t_name", name);
sp.execute();
}
Si je lance ma méthode, j'obtiens l'erreur suivante:
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Je devine que c'est à cause de type de retour void qui est définie dans la fonction j'ai changé de type de retour pour ressembler à ceci:
RETURNS character varying AS
Si je lance ma méthode encore, je suis l'obtention de cette exception au lieu:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults
Personne ne sait ce qui se passe ici et comment bien appeler des procédures stockées dans PostgreSQL, même avec void comme type de retour?
OriginalL'auteur Mirko Filipovic | 2014-09-30
Vous devez vous connecter pour publier un commentaire.
Dans votre classe d'entité, de définir un NamedNativeQuery comme vous le feriez appel postgresql de la fonction à sélectionner.
hibernate n'est pas en mesure de carte vide, si une solution de contournement consiste à jeter le résultat en tant que texte
Désolé @AlexG pour la réponse tardive, j'ai édité Entité code de la suggestion, mais j'espère que vous avez déjà trouvé la solution
OriginalL'auteur srex
Depuis que vous utilisez PostgreSQL, vous pouvez, comme vous l'avez déjà écrit, appel tout procédure stockée de type fonction dans
SELECT
(Oracle, autrement, serait vous uniquement exécuter les fonctions déclarées à lire seulement en sélectionne).Vous pouvez utiliser
EntityManager.createNativeQuery(SQL)
.Puisque vous êtes à l'aide de Printemps, vous pouvez utiliser
SimpleJdbcTemplate.query(SQL)
pour exécuter une instruction SQL, ainsi.OriginalL'auteur Danubian Sailor
Je pense que c'est le
RETURN VOID
qui est à l'origine du problème. Il est un article sur ce sujet qui pourrait vous aider:Après que vous avez changé de fonction pour revenir à valeur factice, de modifier la procédure stockée requête:
OriginalL'auteur Vlad Mihalcea
Dans le cas où vous utilisez également au printemps de données, vous pouvez simplement définir une procédure à l'intérieur de votre
@Repository
interface comme ceci,Plus dans le docs.
OriginalL'auteur George Siggouroglou
Si vous voulez garder les choses simples, faites simplement ceci:
Notez que j'ai utilisé (liste) intentionnellement.. pour une raison quelconque .mise à jour() ne fonctionne pas pour moi.
OriginalL'auteur Roberto Rodriguez