Как сделать запрос в jDBI?

Как я могу выполнить что-то подобное в jDBI?

table: foo (id int, name varchar) @SqlQuery("select id from foo where name in <list of names here>") List<Integer> getIds(@Bind("nameList") List<String> nameList); 

Подобно @SelectProvider от myBatis.

Схожие вопросы заданы. Как создать динамический запрос Sql во время выполнения с использованием JQBI-объекта API-интерфейса? , но почему-то ответ мне непонятен.

    Это должно работать:

     @SqlQuery("select id from foo where name in (<nameList>)") List<Integer> getIds(@BindIn("nameList") List<String> nameList); 

    Не забывайте комментировать класс, содержащий этот метод, с помощью:

     @UseStringTemplate3StatementLocator 

    аннотация (под прикрытием JDBI использует Apache StringTemplate для выполнения таких подстановок). Также обратите внимание, что с помощью этой аннотации вы не можете использовать символ «<» в своих SQL-запросах без экранирования (beacause – это специальный символ, используемый StringTemplate).

    Используйте @Define аннотацию для создания динамических запросов в jDBI. Пример:

     @SqlUpdate("insert into <table> (id, name) values (:id, :name)") public void insert(@Define("table") String table, @BindBean Something s); @SqlQuery("select id, name from <table> where id = :id") public Something findById(@Define("table") String table, @Bind("id") Long id); 

    С PostgreSQL я смог использовать ЛЮБОЕ сравнение и привязать коллекцию к массиву для достижения этого.

     public interface Foo { @SqlQuery("SELECT id FROM foo WHERE name = ANY (:nameList)") List<Integer> getIds(@BindStringList("nameList") List<String> nameList); } @BindingAnnotation(BindStringList.BindFactory.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface BindStringList { String value() default "it"; class BindFactory implements BinderFactory { @Override public Binder build(Annotation annotation) { return new Binder<BindStringList, Collection<String>>() { @Override public void bind(SQLStatement<?> q, BindStringList bind, Collection<String> arg) { try { Array array = q.getContext().getConnection().createArrayOf("varchar", arg.toArray()); q.bindBySqlType(bind.value(), array, Types.ARRAY); } catch (SQLException e) { // handle error } } }; } } } 

    NB: ANY не является частью стандарта ANSI SQL, поэтому это создает жесткую зависимость от PostgreSQL.