@query с именованным @param возвращает пустой набор результатов при использовании sql IN - PullRequest
0 голосов
/ 28 июня 2018

Кстати, это уже работает с решением на основе шаблонов jdbc, которое я написал. Это не я хочу сделать переписать, это идея технического лидера. Это вызывает у меня головную боль. Давайте не будем вдаваться в дискуссию о том, почему это хорошая идея или нет, а о том, как заставить ее работать.

в моем репо @Repository интерфейс 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 голосов
/ 09 июля 2018

это оказалось самым простым решением вместо:

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

сделать:

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

и добавьте FF в строку состояний перед тем, как я вызову функцию.

0 голосов
/ 28 июня 2018

Вы передаете все возможные значения в одном параметре, поэтому не получаете ожидаемых результатов.

Вы должны изменить предложение where следующим образом:

"WHERE em.ct in ( :custTypes1, :custTypes2, :custTypes3 .... :custTypesN) "
...