【问题标题】:How to use table functions in queries with Spring Data如何在 Spring Data 查询中使用表函数
【发布时间】:2014-03-23 20:07:52
【问题描述】:

将 Spring Data JPA 与 Hibernate 结合使用时,有哪些选项可用于编写与 table functions 连接的查询。

例如,我想生成如下所述的查询:

CASE 1: SELECT * FROM getfoo(1) AS t1;

CASE 2: SELECT * FROM getfoo(1) x INNER JOIN tbl1 y on x.id = y.id;

编辑 为了详细说明,我将 Spring Data 用于所有 CRUD(效果很好)。但是,我需要编写将表与“表函数”连接起来的复杂查询。表函数(AKA 表值用户定义函数)是返回表值的数据库函数,可以在 JOIN 子句中与表结合使用。 Postgresql 和 Sql Server 支持它们。

在 Spring Data 领域中,它包含的不仅仅是 JPA,在编写此类查询时需要考虑哪些选项?根据您的经验,最佳实践是什么? user2658013 非常友好地描述了一种使用 entityManager.reateNativeQuery 方法的方法。

在我看来,选项如下:

  • JPA
    • 使用@NamedStoredProcedureQuery (>=JPA 2.1)
    • 使用 entityManager.createNativeQuery 或 @NamedNativeQuery
  • 非标
    • 使用 Spring Data 的 @Query 直接在存储库方法上声明查找器查询。
    • 使用 SimpleJdbcCall
    • 还有其他人吗?

【问题讨论】:

  • 当使用 Spring Data JPA 时,您将使用 JPA。在 JPA 中,您拥有实体及其关系,并且您在此级别使用 JPA 查询。但不是在表级别。 - 但也许我理解你的问题是错误的,那么请多解释一下你的问题。
  • 1.你可以使用视图。 2. JPA 2.1 支持存储过程,但你现在必须使用 eclipselink
  • @NeilMcGuigan 谢谢,Hibernate >= 4.3.1.Final 支持 JPA 2.1
  • @Ralph,我已经用更多上下文进一步编辑了这个问题。就您的观点而言,您是对的,但是,我想知道 Spring Data 保护伞下是否还有其他东西可以帮助处理与类型安全、保持事物干燥以及功能/甚至在 JPA 领域之外的过程映射。

标签: spring hibernate postgresql jpa spring-data


【解决方案1】:

我相信您在询问 Postgres 存储函数。 Postgres 存储函数类似于“存储过程”。所以我想你是在问如何使用 JPA 调用存储过程?我接近了吗?

以下伪代码源自此处发布的详细信息(请参阅存储采购部分): http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html

EntityManager em = emf.createEntityManager();
SOMEVAL_TYPE result = (SOMEVAL_TYPE)em.createNativeQuery("SELECT getfoo(?1) FROM SOMEDB")
                      .setParameter(1, SOME_PARM)
                      .getSingleResult(); 

一般来说,您可以将 JPQL 与 JPA 一起使用,而不是 SQL。

注意!以上假设您已经在 Postgres 数据库中创建了存储函数。

希望有帮助:)

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 2013-02-05
    • 2017-11-12
    • 2019-05-03
    • 2017-02-08
    • 2021-01-07
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多