【问题标题】:How to pass column name dynamically inside a @Query annotation using Spring data JPA如何使用 Spring data JPA 在 @Query 注释中动态传递列名
【发布时间】:2019-09-02 18:58:31
【问题描述】:

我有这样的实体:

@Id
@Column_name = "abc"
int pk;
@Column_name = "def"
int id;

我的存储库为:

interface fetchDataRepository extends jpaRepository<className, int> {
    @Query("Select S_Test.nextVal from dual");
    Long generateId();
}

在上面的示例中,S_Test 是硬编码的序列名称。 但问题是我想动态传递序列名称如下:

Long generateId(@Param("sequenceName") String sequenceName)

并在@Query 注释中使用:

@Query("Select :sequenceName.nextVal from dual");

有没有办法做到这一点?任何建议将不胜感激。

编辑:不能使用#(#entityName)。如果是的话,请告诉我怎么做?

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    不幸的是,您只能用 JDBC 中可以做的事情来替换(因此,几乎只是 INSERT 和 WHERE 子句中的值)。不支持动态表、列、模式名称。

    有一个例外可能适用,那就是limited subset of SpEL can be used。有一个变量可用 - #entityName。因此,假设您的实体类上的 @Entity 注释与序列命名相同,您可以像这样使用 @Query

    @Query("Select #{#entityName}.nextVal from dual");
    

    否则,由于您的查询很简单并且不涉及任何对象关系映射,您可能需要Create a custom repository implementation 并在其中注入JdbcTemplate 才能运行查询。

    否则,您可以注入 EntityManager 并尝试使用 JPA Criteria API - 但实际上您并没有尝试将结果集映射到实体,因此 JdbcTemplate 会更简单。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2018-08-13
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2022-01-19
      • 2018-01-19
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多