【问题标题】:How do I bind a list of tuples in jdbi?如何在 jdbi 中绑定元组列表?
【发布时间】:2019-04-16 06:47:28
【问题描述】:

我有一个这种格式的mysql查询

SELECT * from xyz where (key1, key2) in (('val1', 'val2'), ('val3', 'val4'));

我正在使用 jdbi 进行此查询。如何在 jdbi 中绑定元组列表? 我试图使用这样的东西

List<String[]> query = new ArrayList<>();
for(String key: vars.keySet()){
  String[] entry = {key, vars.get(key)};
  query.add(entry);
}
List<String> result = getBasicQuery() + " WHERE (key, val) in (<query>)".bindList("query", query);

以这种方式使用绑定时出现此错误

 No argument factory registered for '[Ljava.lang.String;@11fa461a' of type class [Ljava.lang.String;

【问题讨论】:

    标签: java mysql sql jdbi


    【解决方案1】:

    实际上在 JDBI3 中很容易做到这一点,但由于某种原因,jdbi.org 上没有记录该解决方案。

    这里是:

    List<String> result = handle.createQuery(getBasicQuery() + " WHERE (key, val) in (<query>)")
        .bindMethodsList("query", query, List.of("getKey", "getValue"))
        .mapTo(String.class)
        .list();
    

    请注意,要使用bindMethodsList(),您需要将查询对象定义为具有公共方法(即getter)的类的实例。像这样的东西会很好用:

    class Query {
      String key;
      String value;
    
      Query(String key, String value) {
        this.key = key;
        this.value = value;
      }
    
      public String getKey() {
        return key;
      }
    
      public String getValue() {
        return value;
      }
    }
    

    或者,您可以通过公开属性本身并使用bindBeanList()来跳过getter。

    【讨论】:

      【解决方案2】:

      正如@talon55 所说,bindBeanList 方法是另一种选择:

      
      String QRY_STRING = "SELECT id FROM settlement_report WHERE (user_id, reference_id, has_type_id, record_type) IN (<conditions>)";
      
      List<String> fieldsBean = Arrays.asList("userId", "referenceId", "hasTypeId", "recordType");
      
      handle.createQuery(QRY_STRING)
      .bindBeanList("conditions", records, fieldsBean);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-30
        • 2021-10-26
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2021-08-23
        • 2021-05-27
        • 2016-09-11
        相关资源
        最近更新 更多