2016-05-12 48 views
0

私が知る限り、ストアドプロシージャmysqlと書いても、JPAと書くことはできませんが、共通の機能(mysql)は何ですか?JPA(JAVA)経由でストアドファンクションを呼び出すことはできますか?

JPAを使用してストアドmysql関数を呼び出すにはどうすればよいですか?

多分EntityManagerの方法createNativeQuery

(例を作るにしてください)

+0

はいを​​あなたの関数を指定します。あなたは 'JPA'を使って手続きを呼び出すことができます... –

+0

おそらくあなたはJPA 2.1を読むべきです。インターネット上には多くの文書があり、StoredProcedureを呼び出す方法は –

+0

です。>> http://www.thoughts-on-java.org/call-stored-procedures-jpa/ –

答えて

1

として、私の知る、JPA

あなたが ストアドプロシージャを呼び出すことができます

号でMySQLに書かれたストアドプロシージャを呼び出すことは不可能である JPAから。方法の例については、hereを参照してください。

JPAを使用してストアドmysql関数を呼び出すにはどうすればよいですか?

JPAのMySQLストアドファンクションを呼び出すことができます。 JPA 2.1では、事前定義された(CONCAT,SUBSTRINGなど)関数またはユーザー定義関数を呼び出すためのFUNCTION()関数が導入されています。

言って、たとえば、あなたがそのような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$$ 

として、独自のMySQL関数を定義したし、その後、例えば、あなたのJPQLクエリで

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

私は同様の解決策を見つけました。私はちょうど "nativeQuery"を使用しました。しかし、私はこれを行うことができます:entityManager.find(Employee.class、FUNCTION( 'LAST_INSERT_ID()'));それはできません; – EchoCache

+0

これはできません。[EntityManager#find](http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#find-java)のドキュメントを読んでください。オブジェクト(識別子値を持つJavaオブジェクト)はJPQL式ではないと期待していますが、一方、 'FUNCTION( 'LAST_INSERT_ID() ') 'それはJPQLのために定義された有効な文法ではありません – Bunti

+0

' LAST_INSERT_ID'に複雑なロジックがあり、最後に挿入されたIDを返すだけではない場合、[Entitymanager#createNativeQuery](http://docs.oracle .com/javaee/7/api/javax/persistence/EntityManager.html#createNativeQuery-java.lang.String-java.lang.Class-)またはそのオーバーロードのいずれかを使用して、ストアド関数を呼び出します。 – Bunti

関連する問題