передать неизвестное количество параметров в предложение IN, используя JDBC и Postgres - PullRequest
0 голосов
/ 03 октября 2019

Мой запрос выглядит следующим образом и хорошо работает:

select * 
from table t 
where (t.one,t.two,t.three) in ( (11,12,13), (21,22,23) );

Теперь число этих триплетов в операторе in будет меняться, поэтому я пытаюсь сделать следующее с JDBC:

String sql = "select * from table where (one, two, three) in (select * from unnest(?::smallint[], ?::integer[], ?::integer[]))"
// conn is the java.sql.Connection
PreparedStatement ps = conn.prepareStatement(sql);
ps.setArray(1, conn.createArrayOf("smallint", new Short[]{11, 21}));
ps.setArray(2, conn.createArrayOf("integer", new Integer[]{12,22}));
ps.setArray(3, conn.createArrayOf("integer", new Integer[]{13,23}));
return ps;

И это ужасно плохо. Так есть ли способ отправить триплеты с использованием jdbc так, чтобы конечный результат был эквивалентен SQL-запросу?

У меня было бы два индекса btree, один на one, two, а другой на one, three Мне нужноиспользуйте любой из них, чтобы сделать этот исполнитель

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Я мог бы добиться этого, используя NamedParameterJdbcTemplate

String sql = "select * from table " +
        "where (one, two, three) in (:valuesMap)";

List<Integer[]> valuesMap = new ArrayList<>();
valuesMap.add(new Integer[]{11,12,13});
valuesMap.add(new Integer[]{21,22,23});
SqlParameterSource params = new MapSqlParameterSource("valuesMap", valuesMap);

return jdbc.query(sql, params, resultSetExtractor);

Это работает, несмотря на то, что one является smallint

0 голосов
/ 03 октября 2019

Вы можете создать составной тип, например

CREATE TYPE triple AS (
   a smallint,
   b integer,
   c integer
);

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

SELECT * 
FROM t 
WHERE (t.one, t.two, t.three) = ANY (?::triple[]);

Вы бы предоставили массив в виде одной строки, которая выглядит как

{(11\,12\,13), (21\,22\,23)}

= ANY делает то же самое, что и IN, но его можно использовать с массивом справа.

...