Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jDBI中进行查询?_Java_Sql_Jdbi - Fatal编程技术网

Java 如何在jDBI中进行查询?

Java 如何在jDBI中进行查询?,java,sql,jdbi,Java,Sql,Jdbi,我如何在jDBI中执行这样的事情 @SqlQuery("select id from foo where name in <list of names here>") List<Integer> getIds(@Bind("nameList") List<String> nameList); @SqlQuery(“从名称所在的foo中选择id”) List getid(@Bind(“nameList”)List nameList); 表:foo(id in

我如何在jDBI中执行这样的事情

@SqlQuery("select id from foo where name in <list of names here>")
List<Integer> getIds(@Bind("nameList") List<String> nameList);
@SqlQuery(“从名称所在的foo中选择id”)
List getid(@Bind(“nameList”)List nameList);
表:
foo(id int,name varchar)

类似于myBatis的@SelectProvider


有人问过类似的问题,但不知何故,我并不清楚答案。

使用@Define注释在jDBI中构建动态查询。 例如:

@SqlUpdate(“插入(id,name)值(:id,:name)”)
public void insert(@Define(“table”)String table,@BindBean/s);
@SqlQuery(“选择id,其中的名称id=:id”)
public Something findById(@Define(“table”)String table,@Bind(“id”)Long id);
这应该可以:

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

注释(因为JDBI使用ApacheStringTemplate进行这种替换)。还请注意,使用此注释时,您不能将“与PostgreSQL一起使用,我可以使用ANY比较并将集合绑定到数组来实现这一点

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
                    }
                }
            };
        }
    }
}
公共接口Foo{
@SqlQuery(“从foo中选择id,其中name=ANY(:nameList)”)
List getid(@BindStringList(“nameList”)List nameList);
}
@BindingAnnotation(BindStringList.BindFactory.class)
@保留(RetentionPolicy.RUNTIME)
@目标({ElementType.PARAMETER})
public@interface BindStringList{
字符串值()默认为“it”;
类BindFactory实现BinderFactory{
@凌驾
公共活页夹生成(注释){
返回新活页夹(){
@凌驾
公共void绑定(SQLQ语句、BindStringList绑定、集合参数){
试一试{
Array Array=q.getContext().getConnection().createArrayOf(“varchar”,arg.toArray());
q、 bindBySqlType(bind.value(),数组,Types.array);
}捕获(SQLE异常){
//处理错误
}
}
};
}
}
}

注意:ANY不是ANSI SQL标准的一部分,因此这会创建对PostgreSQL的硬依赖。

如果您使用的是JDBI 3 Fluent API,则可以使用带有以下属性的
bindList()

List<String> keys = new ArrayList<String>()
keys.add("user_name");
keys.add("street");

handle.createQuery("SELECT value FROM items WHERE kind in (<listOfKinds>)")
      .bindList("listOfKinds", keys)
      .mapTo(String.class)
      .list();

// Or, using the 'vararg' definition
handle.createQuery("SELECT value FROM items WHERE kind in (<varargListOfKinds>)")
      .bindList("varargListOfKinds", "user_name", "docs", "street", "library")
      .mapTo(String.class)
      .list();
List key=new ArrayList()
添加(“用户名”);
加上(“街道”);
createQuery(“从类位于()中的项中选择值”)
.bindList(“种类列表”,键)
.mapTo(String.class)
.list();
//或者,使用“vararg”定义
createQuery(“从类位于()中的项中选择值”)
.bindList(“varargListOfKinds”、“用户名”、“文档”、“街道”、“图书馆”)
.mapTo(String.class)
.list();
请注意查询字符串如何使用
而不是通常的
:listOfKinds


文档在这里:

我如何逃逸
找到了答案。您应该做
\\需要添加本手册中提到的依赖项。但是,如果我想在进行比较之前对列表中的每个项目应用
lower
函数,该怎么办呢。我在(lower())中尝试了
lower(name)
。这当然不行。有什么想法吗?@VikasPrasad为什么不在执行查询之前对代码中的参数进行预处理?我假设您必须将
@UseStringTemplate3StatementLocator
添加到类中以支持
@Define
,但您是如何让它仍然进行参数绑定的(
@Bind
)除了
@Define
?有任何答案解决了这个问题吗?我正在尝试@BindIn,但运气不好:(
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
                    }
                }
            };
        }
    }
}
List<String> keys = new ArrayList<String>()
keys.add("user_name");
keys.add("street");

handle.createQuery("SELECT value FROM items WHERE kind in (<listOfKinds>)")
      .bindList("listOfKinds", keys)
      .mapTo(String.class)
      .list();

// Or, using the 'vararg' definition
handle.createQuery("SELECT value FROM items WHERE kind in (<varargListOfKinds>)")
      .bindList("varargListOfKinds", "user_name", "docs", "street", "library")
      .mapTo(String.class)
      .list();