2016-05-12 15 views
0

Soweit ich weiß, ist es unmöglich, eine gespeicherte Prozedur geschrieben in mysql mit JPA aber was ist mit gemeinsamen Funktionen (mysql)?Kann eine gespeicherte Funktion über JPA (JAVA) aufgerufen werden?

Wie kann ich eine gespeicherte mysql-Funktion mit der Verwendung von JPA aufrufen?

Vielleicht mit der EntityManager Methode createNativeQuery?

(Versuchen Sie ein Beispiel zu machen)

+0

ja. Sie können Prozeduren mit 'JPA' aufrufen ... –

+0

Vielleicht sollten Sie JPA 2.1 lesen. Es gibt viele Dokumente im Internet dafür und wie man eine StoredProcedure ruft –

+0

verweisen diese >> http://www.thoughts-on-java.org/call-stored-procedures-jpa/ –

Antwort

1

Soweit ich weiß, ist es unmöglich, eine gespeicherte Prozedur in Mysql mit JPA geschrieben nennen

Nein, Sie gespeicherte Prozeduren aufrufen können von JPA. Ein Beispiel dafür, wie es geht, finden Sie unter here.

Wie kann ich eine gespeicherte mysql-Funktion unter Verwendung von JPA aufrufen?

Sie können eine MySQL gespeicherte Funktion von JPA anrufen. JPA 2.1 führt FUNCTION() -Funktion ein, um beliebige vordefinierte (wie CONCAT, SUBSTRING) oder benutzerdefinierte Funktionen aufzurufen.

Nehmen wir zum Beispiel, haben Sie Ihre eigene MySQL-Funktion so definiert, wie shouldGetBonus

CREATE FUNCTION shouldGetBonus (INT department_id, INT project_id) 
RETURNS boolean 
DETERMINISTIC 
BEGIN 
    DECLARE is_eligible boolean; 
    SET is_eligible = -- eligible to get bonus 
    RETURN is_eligible; 
END$$ 

und dann in Ihre JPQL Abfrage geben Sie Ihre Funktion, zum Beispiel

String query = "SELECT DISTINCT e FROM Employee e JOIN e.projects p WHERE FUNCTION('shouldGetBonus', e.department.id, p.id)" 
TypedQuery<Employee> emps = entityManager.createQuery(query, Employee.class); 
emps.getResultList(); 
+0

Ich habe eine ähnliche Lösung gefunden. Ich habe gerade "nativeQuery" verwendet. Kann ich das tun: entityManager.find (Employee.class, FUNCTION ('LAST_INSERT_ID()')); aber das funktioniert nicht; ( – EchoCache

+0

Nein, Sie können das nicht tun. Lesen Sie die Dokumentation für [EntityManager # finden] (http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#find-java .lang.Class-java.lang.Object-) Methode Es erwartet ein Object (Java-Objekt mit dem Bezeichner-Wert) nicht einen JPQL-Ausdruck, andererseits kann kein JPQL-Ausdruck wie 'FUNCTION ('LAST_INSERT_ID() ') 'wie es keine gültige Grammatik für JPQL ist – Bunti

+0

Wenn Sie eine komplexe Logik in' LAST_INSERT_ID' haben und nicht nur die zuletzt eingefügte ID zurückgeben, müssen Sie [Entitymanager # createNativeQuery] (http://docs.oracle .com/javaee/7/api/javax/persistence/EntityManager.html # createNativeQuery-java.lang.String-java.lang.Class-) oder eine seiner Überladungen, um die gespeicherte Funktion aufzurufen. – Bunti

Verwandte Themen