JPA Hibernate Call Postgres-Funktion Void Return MappingException:

Ich habe ein Problem, bei dem ich Folgendes erhalte:org.hibernate.MappingException: Keine Dialektzuordnung für JDBC-Typ: 1111 Wenn Sie versuchen, eine Postgres-Funktion mit JPA aufzurufen, erstellen Sie eine systemeigene Abfrage.

Ich habe einen EJB-Timer in einem Start-Singleton erstellt, um alle 6 Stunden eine Postgres-Funktion auszuführen. Die Funktion gibt void zurück und prüft auf abgelaufene Datensätze, löscht sie und aktualisiert einige Status. Es werden keine Argumente benötigt und es wird nichtig zurückgegeben.

Die postgres-Funktion läuft einwandfrei, wenn ich sie mit dem PgAdmin-Abfragetool (select function ();) aufrufe und void zurückgibt.

Wenn ich die App auf Glassfish 3.1.1 bereitstelle, wird eine Ausnahme gemeldet und die Bereitstellung schlägt fehl.

Dies ist der (verkürzte) Stack-Trace:

WARNING: A system exception occurred during an invocation on EJB UserQueryBean method public void com.mysoftwareco.entity.utility.UserQueryBean.runRequestCleanup()
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean
...STACK TRACE BLAH BLAH BLAH ...
Caused by: javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

Hier ist der Code:

Zuerst das JPA-Zeug:

public void runRequestCleanup() {
    String queryString = "SELECT a_function_that_hibernate_chokes_on()";
    Query query = em.createNativeQuery(queryString);
    Object result = query.getSingleResult();
}

Dies ist der Singleton, der es nennt:

@Startup
@Singleton
public class RequestCleanupTimer {
    @Resource
    TimerService timerService;
    @EJB
    UserQueryBean queryBean;

    @PostConstruct
    @Schedule(hour = "*/6")
    void runCleanupTimer() {
        queryBean.runRequestCleanup();
    }
}

Und die Funktion:

CREATE OR REPLACE FUNCTION a_function_that_hibernate_chokes_on()
  RETURNS void AS
$BODY$
    DECLARE 
        var_field_id myTable.field_id%TYPE;
    BEGIN
        FOR var_field_id IN
                select field_id from myTable 
                where status = 'some status'
                and disposition = 'some disposition'
                and valid_through < now()
        LOOP
            BEGIN
                -- Do Stuff
            END;
        END LOOP;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Antworten auf die Frage(6)

Ihre Antwort auf die Frage