Tôi đang sử dụng Spring MVC 4, Hibernate và PostgreSQL 9,3 và đã xác định chức năng (stored procedure) bên trong Postgres như thế này:Làm thế nào để gọi đúng các hàm PostgreSQL (các thủ tục lưu sẵn) trong Spring/Hibernate/JPA?
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;
Nếu tôi chạy chức năng này bên pgAdmin như thế này nó làm việc tốt:
select spa.create_tenant('somename');
Bây giờ tôi đang cố gắng để chạy chức năng này từ dịch vụ của tôi như thế này:
@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();
}
Nếu tôi chạy phương pháp của tôi tôi nhận được lỗi sau:
javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Tôi đoán đây là vì lợi nhuận kiểu void được xác định trong chức năng vì vậy tôi đã thay đổi kiểu trả về để trông như thế này:
RETURNS character varying AS
Nếu tôi chạy phương pháp của tôi một lần nữa tôi nhận được ngoại lệ này thay thế:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Error calling CallableStatement.getMoreResults
Có ai biết điều gì đang xảy ra ở đây và cách gọi đúng thủ tục lưu trữ trong PostgreSQL ngay cả khi không có loại trả về?
Làm thế nào bạn thường gọi là JDBC CallableStatement? Đó là tất cả các API JPA kết thúc tốt đẹp. Nếu Hibernate không phản chiếu những gì JDBC cung cấp thì hãy thử một nhà cung cấp JPA khác để xem cách xử lý nó như thế nào –