0

以下の表では、国には複数の州、州には複数の都市、都市には複数の地域、地域には複数の道路を含めることができます。

データベース テーブル:

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 オブジェクトが作成されているかどうかを手動で確認する必要があります。残りの行には作成されず、残りの値にも同じように作成されるべきではありません。

この種の問題を解決するためのより良いパターンはありますか?

4

1 に答える 1

0

これを行う簡単な方法はMap<ID, VO>、オブジェクトの種類ごとに for を使用することです。

行を読み取るたびに、その行にある国の ID を取得し、この国が既にマップにあるかどうかを調べます。そうでない場合は、残りの行セルから作成し、マップに配置します。

次に、状態に対して同じことを行います。州がまだマップにない場合は、州を作成し、国に追加して、マップに追加します。などなど

于 2013-07-17T11:43:55.650 に答える