繁体   English   中英

JPA JPQl或MySQL中的存储过程

[英]JPA JPQl or Stored Procedures in MySQL

我正在开发一个使用JPA 2.0和MySQL 5数据库的应用程序。

我知道JPA隐藏了对数据库查询的调用并使其成为继续,我使用的只是JPQL,

现在这是否会减少对存储过程的需求? 以及如何在JPA 2.0中使用存储过程?

存储过程大多不受欢迎(您可以在此处阅读有关原因的一些想法: http//www.codinghorror.com/blog/2004/10/who-needs-stored-procedures-anyways.html )。

通常,除非您遇到性能问题或正在使用旧系统,否则建议不要使用存储过程。 对象关系映射解决方案(如JPA)现在已成为行业标准,主要是因为它们可以让您编写更少的内容,并且比其他方法(例如直接使用DAO模式和JDBC)更容易维护。

例如,考虑使用CRUD(创建,检索,更新,删除)向表添加新列:

  • 使用JPA,您可以将列添加到表中,并使用注释将该属性添加到类中,就是这样。
  • 使用存储过程,您还需要将参数添加到过程以更新或创建新实体,您需要将该列添加到过程内的insert或update语句,在某些情况下您需要将列添加到过程内的select子句。

关于使用存储过程,JPA本身不支持存储过程,但有两种方法可以解决它:

  • 一些JPA实现(例如EclipseLink或Hibernate)支持存储过程,您可以直接使用它们的实现,您将必须查看您正在使用的实现。
  • 您可以使用“本机查询”功能,让您使用Native数据库查询语言编写sql,例如对于mySQL,您可以编写如下内容:

     Query query = entityManager.createNativeQuery("{ CALL procedure(?) }"); query.setParameter(1, parameterName); 

    您还需要记住,该过程必须返回结果集,并且您不能使用out参数。

如果使用EclipseLink JPA,则可以对存储过程使用@NamedStoredProcedureQuery批注。

示例:

@NamedStoredProcedureQuery(
    name="findAllEmployees", 
    procedureName="EMP_READ_ALL", 
    resultClass=Employee.class, 
    parameters = {
        @StoredProcedureParameter(
            queryParameter="result", 
            name="RESULT_CURSOR",
            direction=Direction.OUT_CURSOR
        )
    }
)
@Entity
public class Employee {
  ...
}

你可以在这里参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM