Java 如何在jDBI中进行查询?
我如何在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
@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();