具有本机查询和有序参数的查询字符串,sql 不起作用



我有以下代码

@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()}

但这只是开始,我需要开始和结束。

JDBC参数只能包含在SQL语句中非常特定的位置。它们不会被替换为SQL语句中的字符串,而是被应用。具体的有效位置因数据库而异,也取决于JDBC驱动程序的变体/版本。

一般规则是,可以在存在单个值的情况下应用参数。字符串参数不应像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

尽管如此,具体的语法变化可能会有所不同,这取决于您正在使用的数据库(您没有提到(。

相关内容

  • 没有找到相关文章