sql - 使用 sql IN 时,带有名为 @param 的 @query 返回空结果集
问题描述
顺便说一句,这已经在使用我编写的基于 jdbc 模板的解决方案。不是我想要重写,这是技术主管的想法。这让我很头疼。让我们不要讨论为什么这是或不是一个好主意,而是讨论如何让它发挥作用。
在我的 repo @Repository 接口 Foo...extends JpaRepository
这有效:
@Query(value = "SELECT t.td, em.ct, j.dsc AS bs, ct.dsc AS ct_name, "
+ "t.tn, et.dsc, f.f_id, f.f_life, f.fl_name, em.f_note "
+ "FROM ext_master em join tax t on em.td = t.td "
+ "join bs j on j.bs = t.bs "
+ "join ex_type et on em.ex_type = et.ex_type "
+ "join ct ct on ct.ct = em.ct "
+ "left join ex_f ef on em.td = ef.td and em.ct = ef.ct "
+ "left join f f on ef.f_id = f.f_id "
+ "WHERE em.ct in ( 'CC' ) "
+ "AND t.state IN ('FF','AK','AL','GA')"
+ "ORDER BY bs, t.tn", nativeQuery = true)
List<Object> getExtensionsByCustTypeAndState(@Param("custTypes") String custTypes, @Param("states") String states);
这不会返回空结果集
@Query(value = "SELECT t.td, em.ct, j.dsc AS bs, ct.dsc AS ct_name, "
+ "t.tn, et.dsc, f.f_id, f.f_life, f.fl_name, em.f_note "
+ "FROM extension_master em join tax t on em.td = t.td "
+ "join bs j on j.bs = t.bs "
+ "join exemption_type et on em.ex_type = et.ex_type "
+ "join ct ct on ct.ct = em.ct "
+ "left join ex_f ef on em.td = ef.td and em.ct = ef.ct "
+ "left join f f on ef.f_id = f.f_id "
+ "WHERE em.ct in ( :custTypes ) "
+ "AND t.state IN ('FF', :states)"
+ "ORDER BY bs, t.tn", nativeQuery = true)
List<Object> getExByCustTypeAndState(@Param("custTypes") String custTypes, @Param("states") String states);
两者都可以有一个或多个值,我试过:两个参数都像 {:states} :#{#states}
参数内的值由 " 或 ' 包围
在参数中传递整行,例如“AND t.state IN ('FF','AK','AL','GA')”
在 states 参数中传递 'FF','AK','AL','GA' 并用 + "AND t.state IN (:states)" 替换查询中的
我确实写了一个简单的查询来确保我得到正确传递的参数。所以这行得通。
任何人都可以正确地写这个,以便 in 语句起作用,或者告诉我为什么不可能。谢谢你。
解决方案
这最终成为最简单的解决方案,而不是:
"WHERE em.ct in ( :custTypes ) "
+ "AND t.state IN ('FF', :states)"
做:
"WHERE em.ct in :custTypes "
+ "AND t.state IN :states "
并在调用函数之前将 FF 添加到 states 字符串。
推荐阅读
- azure - IotHubClientTransientException:发生瞬态错误,请重试
- java - 使用 StandardXYToolTipGenerator 格式化工具提示值
- javascript - createStore 不会从初始状态更改为 Action 证明值
- cordova - 有没有办法使用 Ionic 3 在浏览器中捕获音频
- spring - 在 Spring AOP 中使用 Aspects 条件执行方法
- php - htmlentities 无法将 HTML 实体转换为字符
- cryptography - 无法创建名称为“http://www.w3.org/2000/09/xmldsig#hmac-sha1”的算法
- c# - Activator.CreateInstance 期间的 MissingMethodException
- excel - 将散点图上的点与系列间隙连接起来
- python - Python图像抓取返回HTML