sql-server - Spring Data @Query中的SQLServer concat问题
问题描述
我在下面有这个查询,它在 MySql 和 Oracle 上运行良好,但在 SQLServer 上失败:
@Query("SELECT ca FROM ContextAccess ca " + "LEFT JOIN UserContextAccess uca on ca.id = uca.id " +
"LEFT JOIN RegularUserInfo rui on rui.user = uca.user " +
"WHERE ca.context = :context and (COALESCE(:roles, null) is null or ca.role in (:roles)) " +
"AND (:name is null or ca.accessType='GROUP' or CONCAT(rui.firstName,' ',rui.lastName) like CONCAT(:name,'%') " +
"or CONCAT(rui.lastName,' ',rui.firstName) like CONCAT(:name,'%'))")
我有这个堆栈跟踪:
com.microsoft.sqlserver.jdbc.SQLServerException: The data types varbinary and varchar are incompatible in the add operator.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1624)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:594)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:248)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:223)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:446)
问题来自CONCAT(:name,'%')
我可以通过使用像这样的“+”运算符来解决它,:name + '%'
但是在它不能在 Oracle 上运行之后
你有解决这个问题的想法吗?
谢谢,
解决方案
您可以使用CONCAT(:name,\"%\")
双引号字符必须在 Java 字符串文字中使用反斜杠进行转义。
推荐阅读
- python-3.x - 转换文件时如何避免重复代码?
- android - 为什么通过 lua 脚本访问数据库会删除 -wal 文件?
- ruby - Ruby win32ole - 如何从对象中获取 WIN32OLE 对象?
- api - 应用程序开发人员的单个 API 令牌和验证用户的电子邮件+密码授权标头?
- flutter - 如何在内容维度发生变化时停止滚动视图的滚动模拟?
- javascript - 如何通过特定字段访问其他用户的数据?
- r - 从 Pdf R Tabulizer 中提取表格时出现空字符
- c# - 设置对动态创建的组件的引用
- amazon-web-services - 将我的 eks 更新到 1.16 后,pod 卡在 CrashLoopBackOff 中
- servlets - Spring Rest:在没有 ResponseEntity 对象的情况下返回 401