Проблема с SQLServer concat внутри Spring Data @Query - PullRequest
0 голосов
/ 07 мая 2020

У меня есть этот запрос ниже, который отлично работает на 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

У вас есть идея решить эту проблему?

Спасибо,

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете использовать CONCAT(:name,\"%\")

Символ двойной кавычки должен быть экранирован обратной косой чертой sh в строковом литерале Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...