使用sql IN时,名称为@param的@query返回空结果集

时间:2018-06-28 14:32:57

标签: sql spring-data-jpa nativequery

这已经与我编写的基于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语句起作用,或告诉我为什么不能这样做。 谢谢。

2 个答案:

答案 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添加到状态字符串上。