Java 解析查询返回的多个值?

Java 解析查询返回的多个值?,java,jdbi,Java,Jdbi,虽然这似乎是一个非常简单的问题,但我提出的唯一解决方案是下面,有没有关于时间复杂度较低、不那么难看的东西的建议 我的应用程序是Java的,正在使用skife.jdbi使用MS sql数据库进行检索 假设我有一个表,其中列a、B和C,其中a和B构成主键。我想检索C给定的a和B。这是很容易做到的。但是,如果我的吞吐量要求很高,那么我想成批地执行这些Select语句。我最终得到的结果如下: 给定一组具有值a和B的Objects,我迭代列表,编译a和B的所有值。然后我运行一个查询,比如从tbl中选择a、

虽然这似乎是一个非常简单的问题,但我提出的唯一解决方案是下面,有没有关于时间复杂度较低、不那么难看的东西的建议

我的应用程序是Java的,正在使用
skife.jdbi
使用MS sql数据库进行检索

假设我有一个
,其中列
a
B
C
,其中
a
B
构成主键。我想检索
C
给定的
a
B
。这是很容易做到的。但是,如果我的吞吐量要求很高,那么我想成批地执行这些
Select
语句。我最终得到的结果如下:

给定一组具有值
a
B
Objects
,我迭代列表,编译
a
B
的所有值。然后我运行一个查询,比如
从tbl中选择a、B、C,其中a在:listOfAs中,B在:listOfBs中
。然后我迭代查询结果,通过比较
a
B
值将结果与原始对象匹配。这些听起来都很合理,但代码最终看起来像下面的代码,这看起来既丑陋又不理想

class MyObject {

  String A;
  String B;
  String C;
  Object otherData;


  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    } else if (!(other instanceof MyObject)) {
      return false;
    } else {
      return A.equals(other.A) && B.equals(other.B);
    }
  }

  @Override
  public int hashCode() {
    return 31 * A.hashCode() + B.hashCode();
  }
}

// populates the of objects with their proper C value
void retrieveC(Set<MyObject> input) {
  Set<String> aValues = new HashSet<>();
  Set<String> bValues = new HashSet<>();

  for (MyObject object : input) {
    aValues.add(object.A);
    bValues.add(object.B);
  }

  // the dao executes the query mentioned above, and returns a Set of  
  // MyObject instances with members A, B, and C populated from the results.
  // Any results that do not contain a value for A, B, and C (which
  // shouldn't exit) are filtered out by the dao.
  Set<MyObject> results = dao.selectC(aValues, bValues);

  // ewww... O(n^2)
  for (MyObject object : input) {
    boolean resultFound = false;

    for (MyObject result : results) {
      if (object.equals(result)) {
        object.C = result.C;
        resultFound = true;
        break;
      }
    }

    if (!resultFound) {
      // handle this case
    }
  }
}
类MyObject{
字符串A;
B串;
字符串C;
对象数据;
@凌驾
公共布尔等于(对象其他){
if(this==其他){
返回true;
}else if(!(MyObject的其他实例)){
返回false;
}否则{
返回A.equals(其他A)和&B.equals(其他B);
}
}
@凌驾
公共int hashCode(){
返回31*A.hashCode()+B.hashCode();
}
}
//用适当的C值填充对象的
无效检索(设置输入){
Set aValues=new HashSet();
Set bValues=new HashSet();
用于(MyObject对象:输入){
添加(对象A);
B值。添加(对象B);
}
//dao执行上述查询,并返回一组
//根据结果填充成员A、B和C的MyObject实例。
//不包含a、B和C值的任何结果(其中
//不应该退出)被dao过滤掉。
设置结果=dao.selectC(avalue,bvalue);
//EWW…O(n^2)
用于(MyObject对象:输入){
布尔resultFound=false;
用于(MyObject结果:结果){
if(object.equals(result)){
object.C=result.C;
resultFound=true;
打破
}
}
如果(!resultFound){
//办案
}
}
}

我认为理想情况是

SELECT A, B, C FROM tbl WHERE A+' '+B IN :listOfAandBs 

这不是
listOfAs x listOfBs
(二次复杂度),而是
listOfAs。listOfBs
(线性,在产品中)

而不是DAO模式,您可以使用

通过这种方式,您可以将批处理切换到流式处理。在JDBI页面给出的示例中,您可以将StringBuilder()与允许您在数据库返回结果时将结果一个接一个地流式传输给接收方的内容进行交换

当然,这是否可能取决于您的开发环境