2016-05-12 80 views
0

据我所知,不可能调用存储过程mysqlJPA写入,但常见函数(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

据我所知,这是不可能调用写在mysql中使用JPA存储过程

号你可以叫存储过程来自JPA。有关如何操作的示例,请参见here

如何使用JPA调用存储的mysql函数?

您可以从JPA调用MySQL存储函数。 JPA 2.1引入了FUNCTION()函数来调用任何预定义的函数(如CONCAT,SUBSTRING)或用户定义的函数。

说,例如,你定义你自己的MySQL功能,如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$$ 

,然后指定你的函数在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 .lang.Class-java.lang.Object-)方法,它需要一个Object(具有标识符值的Java对象)而不是JPQL表达式。另一方面,您不能拥有像JPQL表达式那样的'FUNCTION('LAST_INSERT_ID() '),因为它不是为JPQL定义的有效语法 – Bunti

+0

如果你在'LAST_INSERT_ID'中有一些复杂的逻辑,而不是只返回最后插入的id,你必须使用[Entitymanager#createNativeQuery](http://docs.oracle.com) .com/javaee/7/api/javax/persistence/EntityManager.html#createNativeQuery-java.lang.String-java.lang.Class-)或其重载之一来调用存储函数。 – Bunti

相关问题