带有 OpenQuery 和参数的 NativeQuery

Posted

技术标签:

【中文标题】带有 OpenQuery 和参数的 NativeQuery【英文标题】:NativeQuery with OpenQuery and Parameters 【发布时间】:2016-10-10 13:58:54 【问题描述】:

我一直在尝试使用带有一些参数的 dblink 创建查询。 我使用的是 Hibernate 4,数据库是 MSSQL。

但我要么得到:

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'.

如果我的查询是

@Query(nativeQuery=true, value="SELECT * FROM OPENQUERY([linked_server], 'SELECT * FROM TABLE WHERE COLUM1 = ''0145A'' AND COLUMN2 LIKE ':prefix'' );")
    public List<CPNT023_PART> GET_PART_AND_ANALYST(@Param(value="prefix") String prefix);

或者我得到

java.lang.IllegalArgumentException: Parameter with that position [1] did not exist

如果查询是

@Query(nativeQuery=true, value="SELECT * FROM OPENQUERY([linked_server], 'SELECT * FROM TABLE WHERE COLUM1 = ''0145A'' AND COLUMN2 LIKE '':prefix'' ' );")
public List<CPNT023_PART> GET_PART_AND_ANALYST(@Param(value="prefix") String prefix);

(注意LIKE后单引号的区别)。

如果我不使用任何参数,我会得到正确答案。所以这个查询:

@Query(nativeQuery=true, value="SELECT * FROM OPENQUERY([linked_server], 'SELECT * FROM TABLE WHERE COLUM1 = ''0145A'' AND COLUMN2 LIKE ''%ABC%'' ' );")

确实有效。

我对这个问题有点迷茫,我一直在努力寻找答案,但离一个有效的答案还很远。

我必须使用 OPENQUERY,因为链接服务器是一个巨大的 Oracle 数据库,因为我需要它来进行实际处理。

提前致谢。

【问题讨论】:

【参考方案1】:

最后我没有设法使查询正常工作。

为了解决这个问题,我使用查询在数据库中创建了一些存储过程,这解决了所有问题,因为 @Query 注释不必处理嵌套的撇号。

现在的生活很轻松,而且还在继续。

再见。

【讨论】:

以上是关于带有 OpenQuery 和参数的 NativeQuery的主要内容,如果未能解决你的问题,请参考以下文章

SQL 在OPENQUERY中使用参数,并作为表查询对象/不允许使用远程表值函数调用。

行集函数:OpenRowSet 和 OpenQuery

SQL: OPENQUERY 问题

OpenQuery usage

SQL 使用openquery进行跨库操作

MS SQL - MySQL - Openquery 中文字符导入为“?”