【问题标题】:Is it possible to call a stored function via JPA (JAVA)? [duplicate]是否可以通过 JPA (JAVA) 调用存储的函数? [复制]
【发布时间】:2016-09-08 04:53:42
【问题描述】:

据我所知,用mysql 编写的存储过程JPA 是不可能调用的,但是常用函数(mysql)是什么?

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

也许使用EntityManager 方法createNativeQuery

(试着举个例子)

【问题讨论】:

标签: java mysql sql jpa


【解决方案1】:

据我所知,用JPA调用mysql写的存储过程是不可能的

没有。您可以从 JPA 调用存储过程。请参阅here 了解如何执行此操作的示例。

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

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

比如说,你已经定义了自己的 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();

【讨论】:

  • 我找到了类似的解决方案。我刚刚使用了“nativeQuery”。但是,我可以这样做吗: entityManager.find(Employee.class, FUNCTION('LAST_INSERT_ID()'));但这不起作用;(
  • 不,你不能这样做。阅读EntityManager#find 方法的文档。它需要一个对象(具有标识符值的 Java 对象)而不是 JPQL 表达式。另一方面,您不能拥有像 FUNCTION('LAST_INSERT_ID()') 这样的 JPQL 表达式,因为它不是为 JPQL 定义的有效语法。
  • 如果您在LAST_INSERT_ID 中有一些复杂的逻辑并且不只是返回最后插入的id,您必须使用Entitymanager#createNativeQuery 或其重载之一来调用存储的函数。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多