当前位置: 首页 > 面试题库 >

如何在JDBI中使用IN运算符?

傅新
2023-03-14
问题内容

我正在尝试在Dropwizard上使用MYSQL JDBI进行IN查询(我认为不相关)。

@SqlQuery("SELECT id FROM table where field in (<list>)")
List<Integer> findSomething(@BindIn("list") List<String> someList);

如这里的建议,我还用

@UseStringTemplate3StatementLocator

但是,当我启动应用程序时,出现以下错误:

Exception in thread "main" java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator.errorListener()

有谁对解决这个问题有个好主意?


问题答案:

有两种方法可以实现它。

1 。使用UseStringTemplate3StatementLocator

该注释期望StringTemplate中具有SQL语句的组文件

说我有这个文件PersonExternalizedSqlDAO

// PersonExternalizedSqlDAO.java

package com.daoexp.dao;

@@ExternalizedSqlViaStringTemplate3
@RegisterMapper(PersonMapper.class)
public interface PersonExternalizedSqlDAO {
    @SqlQuery
    List<Person> getPersonByNames(@BindIn("names") List<String> names);
}

由于我们正在使用UseStringTemplate3StatementLocator,因此必须*.sql.stg在相同的类路径中创建文件。
例如:resources/com/daoexp/dao/PersonExternalizedSqlDAO.sql.stg

group PersonExternalizedSqlDAO;

getPersonByNames(names) ::= <<
  select * from person where name in (<names>)
>>

现在,您应该可以进行查询了,没有任何问题。

2 。另一种方法是使用ArgumentFactory来处理JDBI的自定义数据类型(在本例中为List)@Bind。这是最可取的方法。

因此,创建此列表参数工厂

public class ListArgumentFactory implements ArgumentFactory<List> {
    @Override
    public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
        return value instanceof List;
    }

    @Override
    public Argument build(Class<?> expectedType, final List value, StatementContext ctx) {
        return new Argument() {
            @Override
            public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
                String type = null;
                if(value.get(0).getClass() == String.class){
                    type = "varchar";
                } else if(value.get(0).getClass() == Integer.class){
                    // For integer and so on...
                } else {
                    // throw error.. type not handled
                }
                Array array = ctx.getConnection().createArrayOf(type, value.toArray());
                statement.setArray(position, array);
            }
        };
    }
}

这堂课做什么?

  • 接受List的实例
  • 将整数/字符串列表转换为数组,并与准备好的语句绑定

确保使用您的DBI实例注册此参数工厂。

final DBIFactory factory = new DBIFactory();
final DBI jdbi = factory.build(environment, configuration.getDataSourceFactory(), "h2");
jdbi.registerArgumentFactory(new ListArgumentFactory());

现在,您应该能够以List更简单的方式使用来查询@Bind。而已。

@RegisterMapper(PersonMapper.class)
public interface PersonDAO {
    @SqlQuery("select * from person where name = any(:names)")
    List<Person> getPersonByNames(@Bind("names") List<String> names);
}

参考:

  • jdbi文件

附加信息:

// PersonMapper.java
public class PersonMapper implements ResultSetMapper<Person> {

    public Person map(int index, ResultSet r, StatementContext ctx) throws SQLException {
        Person person = new Person();
        person.setId(r.getInt("id"));
        person.setName(r.getString("name"));

        return person;
    }
}


 类似资料:
  • 问题内容: 我有和数组两个值,我想在选择查询中将它与sql IN运算符一起使用。 这是我桌子的结构 我有两个值的数组 我想获取comp_id 1和comp_id 2的记录。因此,我编写了以下查询。 但是它不会返回结果。 问题答案: 由于您拥有普通 整数 就可以做到… (由于不断出现,一些其他信息…) 如果使用 字符串 (特别是 不受信任的 )输入,可以做到 但不能处理NULL之类的值。并会添加引号

  • 我使用的是骆驼2.17.0。我需要在蓝图中的简单语言中使用in运算符。xml文件,如下所示

  • 我试图运行以下查询从SpringBoot仓库 但总是命中错误:绑定变量的数量无效。 请就如何进一步进行提出建议。 注:我确实遵循了Spring Crude的预测结果,即VentoryIds(列表 我想执行如下操作:

  • 问题内容: 您能帮我如何将以下代码转换为使用条件生成器的“ in”运算符吗?我需要使用“ in”使用用户名列表/数组进行过滤。 我还尝试使用JPA CriteriaBuilder-“ in”方法进行搜索,但是找不到很好的结果。 因此,如果您能给我该主题的参考URL,我也将不胜感激。谢谢。 这是我的代码: 内部查询字符串将转换为以下内容,因此我无法获得两个用户创建的记录,因为它使用的是“ AND”。

  • 问题内容: 我正在寻找一种使用数组中的“ IN”子句查询postgres jsonb字段的方法。 假设我有一张桌子 我需要选择test_content数组中的label可能为或的行。 我试过了 但是当我想用包含扩展查询时,或者变得复杂… 我需要的是 jsonb运算符可以吗? 问题答案: 简短答案 您可以在横向联接中使用该函数,并在子句中的复杂表达式中使用其结果: 不同 当在单个行中的多个数组元素中

  • 我想检索以下信息: 从数据库中选择名称,地址如“colombo”和年龄 但对于Java中的MongoDB。从本质上讲,它应该返回包含单词 colombo ang age 大于 20 的所有名称。我知道MongoDB中有$in运算符,但是如何使用Java驱动程序在Java中执行相同的操作?我一直试图到处寻找它,但一无所获。我试过: 但它没有奏效:(请帮忙!