2014-09-30 15 views
5

böyle Postgres içeride Spring MVC 4, Hibernate ve PostgreSQL 9.3 ve tanımladık fonksiyonu (saklı yordam) kullanıyorum: Böyle pgAdmin içinde bu işlevi çalıştırırsanız düzgün şekilde çalışıyorsaSpring/Hibernate/JPA içinde PostgreSQL işlevlerini (saklı yordamları) doğru olarak nasıl çağırılır?

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; 

:

select spa.create_tenant('somename'); 
Şimdi böyle benim hizmetten bu işlevi çalıştırmak çalışıyorum:

@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(); 
} 

aşağıdaki hatayı alıyorum benim yöntemi çalıştırırsanız: Benim yöntemi çalıştırırsanız tekrar alıyorum

RETURNS character varying AS 

: Bunu tahmin ediyorum

javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 

yüzden bu gibi görünmek türü dönmek değişti çünkü fonksiyonu tanımlanır dönüş türü void olan Bunun yerine bu istisna:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults 

kimse burada oluyor ve nasıl düzgün hatta dönüş türü olarak boşluğa ile PostgreSQL saklanan prosedürleri aramak olduğunu biliyor mu? Zaten yazdım olarak

+0

Nasıl bir JDBC CallableStatement çağırır:

CREATE OR REPLACE FUNCTION spa.create_tenant(t_name character varying) RETURNS bigint AS $BODY$ BEGIN EXECUTE format('CREATE SCHEMA IF NOT EXISTS %I AUTHORIZATION postgres', t_name); RETURN 1; END $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION spa.create_tenant(character varying) OWNER TO postgres; 

bazı kukla değeri döndürmek için işlev değiştirmiş sonra bu saklı yordam sorguyu değiştirmek? Tüm JPA API'sı etrafı sarar. Hazırda Bekletme, JDBC'nin verdiği şeyi yansıtmıyorsa, bunu nasıl işlediğini görmek için farklı bir JPA sağlayıcısı deneyin. –

cevap

1

Eğer PostgreSQLkullandığınız için, olabildiğince, Oracle, aksi takdirde sadece olarak ilan işlevlerini yürütmek izin verir (SELECT tip fonksiyon ait herhangi yordamını aramak sadece seçimlerde okunur).

EntityManager.createNativeQuery(SQL)'u kullanabilirsiniz.

İlkbahar'ı kullandığınızdan, herhangi bir SQL deyimini yürütmek için SimpleJdbcTemplate.query(SQL)'u da kullanabilirsiniz.

+0

Bu işlev nasıl çağrılır ve sonuç denetleyicide nasıl bulunur? Bkz. Http://stackoverflow.com/q/41864288/287948 –

2

Varlık sınıfınızda, select ile postgresql işlevini çağırdığınız gibi bir NamedNativeQuery tanımlayın.

import javax.persistence.NamedNativeQueries; 
import javax.persistence.NamedNativeQuery; 
import javax.persistence.Entity; 
@NamedNativeQueries(
    value={ 
      // cast is used for Hibernate, to prevent No Dialect mapping for JDBC type: 1111 
      @NamedNativeQuery(
        name = "Tenant.createTenant", 
       query = "select cast(create_tenant(?) as text)" 
      ) 
    } 
) 
@Entity 
public class Tenant 

hazırda geçersiz haritasına mümkün değildir, bu nedenle geçici bir çözüm metni

public void createSchema(String name) { 
    Query query = em.createNamedQuery("Tenant.createTenant") 
      .setParameter(1, name); 
    query.getSingleResult(); 
} 
+0

Bu sorguyu derleme –

+1

Gecikmiş cevap için Sorry @AlexG, Varlık kodu önerisini düzenledim, ama umarım zaten çözüme ulaşmışsınızdır – srex

1

Ben soruna neden oluyor RETURN VOID olduğunu düşünüyorum sonucu döküm etmektir. hem size yardımcı olabilir an article on this topic vardır:

StoredProcedureQuery query = entityManager 
    .createStoredProcedureQuery("spa.create_tenant") 
    .registerStoredProcedureParameter(1, 
     Long.class, ParameterMode.OUT) 
    .registerStoredProcedureParameter(2, 
     String.class, ParameterMode.IN) 
    .setParameter(2, name); 

query.getResultList(); 
+0

Fonksiyonu nasıl çağırırsınız? ve sonuç kontrol cihazında olsun?Http://stackoverflow.com/q/41864288/287948 sayfasına bakın. –

İlgili konular