我正在尝试通过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
如果我对表名进行硬编码,则可以正常工作
答案 0 :(得分:1)
表名不能被参数化,这就是为什么会出错的原因。
绑定变量的存在主要是出于性能方面的考虑,参数化查询将仅由DB编译一次,并在以后的后续执行中使用相同的编译版本。
占位符的值将是一个字符串。
所以SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM ?1
以xyz
作为表名实际上会转换为
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));