1 つ以上のテーブルから属性のサブセットを選択しているため、このような値を取得していると思いました。実際、最終的には type の配列のリストになりますObject
。これは、各属性が独自の型を持っているためです。このような未定義の状況を処理できる共通のスーパータイプはObject
それ自体です。
ここで取ることができるアプローチは 2 つあります。1 つはデータベースとの対話を強化する必要があり、もう 1 つは取得したばかりのデータを準備するために、このクエリ チューニングを追加の処理に置き換えます。
オプション 1: クエリをもう少しパラメーター化する
クエリに別の条件を追加します。ここで、その 2 番目の属性 (element 2
名前を付けたとおり) を定義します。クエリには、次の追加条件があります。
AND element2 = :element2
このようにelement 2
して、データのクエリを実行するタイミングを決定し、関連データの各サブセットを直接取得できます。このアプローチでは、取得する値と、値と同じ数のクエリに関する事前の知識が必要です。
値は、単純なクエリで取得できます。
SELECT DISTINCT(element2) FROM <YOUR_TABLES_HERE>
クエリを実行するたびにList
のObject[]
が取得されますが、今回は の値がすべて同じになりますelement 2
。
オプション 2: 取得したデータを処理する
クエリを変更できない場合 (または、何らかの理由で異なる値element 2
が取り得る簡単な方法がない場合) は、データベースから取得したばかりの生データを処理する必要があります。
Map
aといくつかの sを混ぜることをお勧めしますList
。element 2
が配列のインデックスの下にあると仮定すると1
、そのリストを反復処理し、値を確認してマップに追加する必要があります。
Map<Long, List<Object[]>> queriedResultsMap = new HashMap<Long,List<Object[]>>();
//Iterate over the obtaines database values
for(Object[] currentArray : yourListOfObject) {
if(!queriedResultsMap.containsKey(currentArray[1])) {
//No element with that value for "element 2" is on the map yet,
//so a new container (List) is created.
queriedResultsMap.put(currentArray[1],new ArrayList<Object[]>());
}
//Adds the element to the associated list.
queriedResultsMap.get(currentArray[1]).add(currentArray);
}
element 2
この単純なコードは、配列の現在のリストを繰り返し処理し、それらのそれぞれを、マップのキーである値に関連付けられたリストに追加します。このマップでは、キーは の値でelement 2
あり、関連する値はList
に対応する値が設定されているすべての検出されたレジストリを含む ですelement 2
。
このif
ステートメントは、 の新しい値に遭遇するたびに新しいリストを作成し、element 2
それをその値に関連付けます。
最後に、データを使用するには、次のようにします。
queriedResultsMap.get(element2Value);
element2Value
結果を取得する値が含まれる場所。マップによって返されるリストには、特定の値 を持つすべての結果が含まれますelement 2
。リストが返されない (get
メソッドが を返すnull
) 場合は、実行したクエリが の値に対して結果を返さなかったことがわかりますelement 2
。
マップを使用すると、見つかった各値を直接関連付けることができelement 2
、取得したすべての値を直接把握できると同時に、特定の値が取得されたかどうかを即座に確認できます。element 2
のどの値が見つかったかを正確に知るにkeySet
は、マップの を取得し、特定の値が取得されたかどうかを知るには のcontainsKey
メソッドを使用しMap
ます。
最適な方法を使用してください。