首页 > 解决方案 > 使用 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 语句起作用,或者告诉我为什么不可能。谢谢你。

标签: sqlspring-data-jpanativequery

解决方案


这最终成为最简单的解决方案,而不是:

"WHERE em.ct in ( :custTypes ) "
  + "AND t.state IN ('FF', :states)"

做:

"WHERE em.ct in  :custTypes "
  + "AND t.state IN :states "

并在调用函数之前将 FF 添加到 states 字符串。


推荐阅读