这已经与我编写的基于jdbc模板的解决方案一起使用了。不是我想要重写,这是技术总监的想法。这让我头疼。 让我们不讨论为什么这是一个好主意,而是如何使它起作用。
在我的仓库中 @资料库 界面Foo ...扩展了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')”中传递整行
在状态参数中传递'FF','AK','AL','GA'并将查询中的替换为 +“ AND t.state IN(:states)”
我确实编写了一个简单的查询来确保我正确传入了参数。这样就可以了。
任何人都可以写出此权限,以便in语句起作用,或告诉我为什么不能这样做。 谢谢。
答案 0 :(得分:0)
您在一个参数中传递了所有可能的值,这就是为什么您无法获得预期结果的原因。
您必须像这样更改where
子句:
"WHERE em.ct in ( :custTypes1, :custTypes2, :custTypes3 .... :custTypesN) "
答案 1 :(得分:0)
这最终是最简单的解决方案 代替:
"WHERE em.ct in ( :custTypes ) "
+ "AND t.state IN ('FF', :states)"
这样做:
"WHERE em.ct in :custTypes "
+ "AND t.state IN :states "
并在我调用该函数之前将FF添加到状态字符串上。