如何在Spring Data的查询中使用表函数

时间:2014-02-22 03:20:07

标签: spring hibernate postgresql jpa spring-data

将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
    • 还有其他人吗?

1 个答案:

答案 0 :(得分: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数据库中创建了存储函数。

希望有所帮助:)