JDBC参数只能包含在SQL语句中非常特定的位置。它们不会被替换为SQL语句中的字符串,而是被应用。具体的有效位置因数据库而异,也取决于JDBC驱动程序的变体/版本。
我有以下代码
@Query(nativeQuery = true, value = "select e.* from event e"
+ " join league l on (l.id = e.league_id)"
+ " join sport s on (l.sport_id = s.id)"
+ " join team t1 on (t1.id = e.team_one_id)"
+ " join team t2 on (t2.id = e.team_two_id)"
+ " join country c on (c.id = l.country_id)"
+ " where l.name LIKE %?1%")
Page<Event> getAllEventsFiltered(final PageRequest of, final String filter);
如果在数据库中执行此SQL,我会收到很多结果,但当从java执行时,我不会在同一SQL中收到任何结果。
我已经试过了:
where l.name LIKE %?#{escape([1])} escape ?#{escapeCharacter()}
但这只是开始,我需要开始和结束。
一般规则是,可以在存在单个值的情况下应用参数。字符串参数不应像VARCHAR
那样用单引号括起来。
使其兼容的一个选项是将参数与其他文本隔离放置,例如使用CONCAT()
函数。您的查询可以改写为:
@Query(nativeQuery = true, value = "select e.* from event e"
+ " join league l on (l.id = e.league_id)"
+ " join sport s on (l.sport_id = s.id)"
+ " join team t1 on (t1.id = e.team_one_id)"
+ " join team t2 on (t2.id = e.team_two_id)"
+ " join country c on (c.id = l.country_id)"
+ " where l.name LIKE concat('%', ?1, '%')") // change here
尽管如此,具体的语法变化可能会有所不同,这取决于您正在使用的数据库(您没有提到(。