一連のクエリを通じてオブジェクトを構築している場合があります。最適化のために、オブジェクトの構築はまとめてバッチ処理され、クエリはIN
句を使用してオブジェクトのバッチ処理を許可します。
以下の例では、 のリストが与えられた場合、との値に基づいMyObject
て入力したいと思います。skife.jdbi ライブラリを使用すると、これに対する私の実装は次のようになります。MyObject.c
MyObject.a
MyObject.b
改善のための提案はありますか?
生の結果セットを解析した方が効率的かもしれません (ただし、インターフェースで結果セットのマッピングを行う方法がわかりません)。
または、クエリ パラメーターを結果に直接マップする方法があれば、もっと整然としたものになります (ただし、方法を見つけることができませんでした)。
class MyObject {
String a;
String b;
String c;
// ....
String z;
}
void populateC(Set<MyObject> objects) {
// parse the list, populating Lists which will be used for the query and a
// Map which will be used to map query results back to the MyObjects in the Set param
Map<PopulateCQuerydata, MyObject> queryDataToParamMap = new HashMap<>;
List<String> aList = new ArrayList<>;
List<String> bList = new ArrayList<>;
for (MyObject object : objects) {
queryDataToParamMap.put(new CResult(object), object);
aList.add(object.a);
bList.add(object.b);
}
Set<CResult> results = dao.getC(aList, bList);
for (CResult result : results) {
queryDataToParamMap.get(result).c = result.c;
}
}
@RegisterMapper(CResultMapper.class)
@UseStringTemplate3StatementLocator("/sql/PopulateCDao.sql.stg")
interface PopulateCDao {
@SqlQuery
List<CResults> getC(@BindIn("aList") List<String> a, @BindIn("bList") List<String> b);
}
class CResults {
String a;
String b;
String c;
CResults(MyObject object) {
a = object.a;
b = object.b;
}
// implement these so this type can be used in the HashMap
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (!(other instanceof CResults )) {
return false;
} else {
CResults otherQueryData = (CResults)other;
return a.equals(otherQueryData.a) && b.equals(otherQueryData.b);
}
}
@Override
public int hashCode() {
int hash = 1;
hash = hash * 31 + a.hashCode() + b.hashCode();
return hash;
}
}
public class CResultMapper implements ResultSetMapper<CResult> {
@Override
public CResult map(int index, ResultSet resultSet, StatementContext statementContext) throws SQLException {
CResult result = new CResult();
result.a = resultSet.getInt("a");
result.b = resultSet.getInt("b");
result.c = resultSet.getInt("c");
return result;
}
}
//sql/PopulateCDao.sql.stg
group PopulateCDao;
getC(aList, bList) ::= <<
SELECT a, b, c FROM tblJoinC WITH (NOLOCK) WHERE a IN (<aList>) AND b IN (<bList>)
>>