首页 > 解决方案 > 使用本机查询和有序参数查询字符串,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()}

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

标签: javasqlspring-bootspring-data-jpaspring-el

解决方案


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

一般规则是可以在存在单个值的情况下应用参数。字符串参数不应像 aVARCHAR那样用单引号括起来。

使其兼容的一种选择是将参数与其他文本隔离,例如通过使用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

不过,具体的语法更改可能会因您使用的数据库而异(您尚未提及)。


推荐阅读