使用Spring Boot进行自定义JPA存储库查询

时间:2018-11-20 17:55:28

标签: sql hibernate spring-boot spring-data-jpa

我正在尝试通过jpa存储库接口执行自定义查询,如下所示:

  @Query(
  value = "SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM ?1",
  nativeQuery = true)
public List<String> getNamesFromView( String viewName);

我想通过用户动态传递要从中获取表的名称。

我遇到运行时异常

nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

如果我对表名进行硬编码,则可以正常工作

1 个答案:

答案 0 :(得分:1)

表名不能被参数化,这就是为什么会出错的原因。

绑定变量的存在主要是出于性能方面的考虑,参数化查询将仅由DB编译一次,并在以后的后续执行中使用相同的编译版本。

占位符的值将是一个字符串。

所以SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM ?1xyz作为表名实际上会转换为

SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM 'xyz',这是无效的SQL

正如您提到的,您拥有entityManager's实例,可以执行如下查询:

entityManager.query(String.format("SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM %s", viewName));