以下の表では、国には複数の州、州には複数の都市、都市には複数の地域、地域には複数の道路を含めることができます。
データベース テーブル:
Country { countryid, name, description }
State { stateid, name, description, countryid (FK) }
City { cityid, name, description, stateid (FK) }
Area { areaid, name, description, cityid (FK) }
Street { streetid, name, description, areaid (FK) }
値を保持する Java 値オブジェクト:
CountryVO { countryId, name, description, List<StateVO> }
StateVO { stateId, name, description, List<CityVO> }
CityVO { cityId, name, description, List<AreaVO> }
AreaVO { areaId, name, description, List<StreetVO> }
StreetVO { streetId, name, description }
ネイティブ選択クエリを使用してすべてのレコードをフェッチし、クエリ結果セットに基づいて値オブジェクトを設定したいと考えています。
クエリを選択
select country.id, country.name, country.description,
state.id, state.name, state.description,
city.id, city.name, city.description,
area.id, area.name, area.description,
street.id, street.name, street.description,
from Country country, State state, City city, Area area, Street street
where country.id = state.id
and state.id = city.id
and city.id = area.id
and area.id = street.id
以下のコードで結果セットを取得します。
Query query = entityManager.createNativeQuery(<above_select_query>);
List<Object[]> stList = (List<Object[]>) query.getResultList();
for (Object[] objects : stList) {
// Here I will populate all my VOs based on values found in result set
}
ここで、列の値が重複する結果セットが得られる可能性があることに注意してください。
例えば:
国 (country-1) に 2 つの州 (state1、state2) があり、両方の州に 2 つの都市 (state1-city1、state1-city2、state2-city1、state2-city2) があり、エリアと通りが同じである場合。
Row1: country-1 | state1 | state1-city1
Row2: country-1 | state1 | state1-city2
Row3: country-1 | state2 | state2-city1
Row4: country-1 | state2 | state2-city2
値オブジェクトにデータを入力しているときに、最初の行に Country オブジェクトが作成されているかどうかを手動で確認する必要があります。残りの行には作成されず、残りの値にも同じように作成されるべきではありません。
この種の問題を解決するためのより良いパターンはありますか?