2016-12-20 5 views
0

Ich habe eine Reihe von StackOverflow-Fragen zu diesem Problem untersucht, kann aber keine finden, die einen Sinn ergeben. This one kommt am nächsten, zeigt jedoch nicht, wie der Rückgabewert von der Funktion erhalten wird.Rückgabewert der Oracle-Funktion mit Mybatis

Hier ist mein Mapper Aufruf:

public Long callMyFunction(@Param("recordId") Long recordId, @Param("otherId") Long otherId, @Param("date") Date date, @Param("comments") String comments); 

Hier ist der Mapper XML:

<select id="callMyFunction" parameterType="map" statementType="CALLABLE" resultType="java.lang.Long"> 
    { #{resultId,javaType=java.lang.Long,jdbcType=NUMERIC,mode=OUT} = call MYSCHEMA.MYPACKAGE.my_function(
    #{recordId,jdbcType=NUMERIC,mode=IN}, 
    #{otherId,jdbcType=NUMERIC,mode=IN}, 
    #{date,jdbcType=DATE,mode=IN}, 
    #{comments,jdbcType=VARCHAR,mode=IN})} 
</select> 

Der Aufruf funktioniert, aber der Rückgabewert (ResultID) ist immer null.

Kann jemand das Problem erkennen?

+0

Haben Sie es mit recordId versucht, javaType = long (nativer Typ) und nicht Long (Objekt-Wrapper)? –

Antwort

1

Wenn Sie das Ergebnis direkt zurückkehren möchten, dann muss der SQL-Aufruf sein: SELECT MYSCHEMA.MYPACKAGE.my_function(...)

Wenn Sie mit dem Aufruf der Funktion in der Prozeduraufruf Stil behalten wollen, bedeutet, dass das Ergebnis ein OUT ist Parameter (Sie env deklariert es). Die minimale Änderung würde darin bestehen, einen Parameter zu dem Mapper Methodensignatur in hinzufügen: public Long callMyFunction(@Param("recordId") Long recordId, @Param("otherId") Long otherId, @Param("date") Date date, @Param("comments") String comments, @Param("resultIdContainer") Map<String, Long> resultIdContainer);

Im XML: vergessen Sie den result, das für s wählen ist. Und der Ruf: { #{resultIdContainer.resultId, javaType=java.lang.Long,jdbcType=NUMERIC,mode=OUT} = call ...

Nicht, dass ich hier eine Karte verwenden, um die resutlId zu enthalten: ein indirection erforderlich ist: die Funktion wird der Parameter ‚Ergebnis‘ Wert schreiben irgendwo kann man später lesen (nach dem Mapper-Aufruf), Sie kann auch eine Klasse mit einer resultId -Eigenschaft verwenden.

+0

Genau das habe ich gebraucht, vielen Dank! – user1071914