java - 使用本机查询和有序参数查询字符串,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 驱动程序变体/版本。
一般规则是可以在存在单个值的情况下应用参数。字符串参数不应像 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
不过,具体的语法更改可能会因您使用的数据库而异(您尚未提及)。
推荐阅读
- javascript - 如何一次打开多个窗口并避免浏览器自动阻止它
- typescript - Angular 5 FormArray 的 removeAt(i) 问题
- python - 合并两个长度不等的元组列表
- sql - 查询中的多个连接 - 可以替换以获得性能?
- mysql - 一天后在 MySQL 中插入新列
- c# - Jama REST Api - 将 where 子句注入 GET
- android - 在 Eclipse 风格的 Android 项目中添加动态功能模块
- events - 如何禁用电子应用程序中的点击事件
- database - Visual Studio 的 Redgate 扩展
- python - 在 Jupyter 小部件上获取键盘事件