2017-08-22 35 views
0

hereの例をResultSetからObjectにマップしても問題ありませんでしたが、その後、私は結合クエリからResultSetをマップできないという問題を認識しました。たとえば私はusrvehicleの2つのテーブルを持っています。私はselectクエリを実行し、これらの2つを結合します。私はUsrオブジェクトにResultSetをマッピングする方法を結合されたResultSetをJavaのオブジェクトにマップする方法は?

public class Usr { 
    public int id; 
    public Vehicle vehicle; 
} 

public class Vehicle { 
    public int id; 
    public int year; 
    public String model; 
    public int user_id; 
} 

?私はちょっとgoogledとSqlResultSetMappingが解決策かもしれないが、それはHibernateを採用するために多くの仕事のように思えます、そして私は純粋に純粋に慣れていますJava。例hereから、すべてのクエリ文を書き直して、db構造体をJavaに置く必要があるようです。

ResultSetをオブジェクトにマップする方法はありますか?他の方法はありますか?

EDITED

クエリは、このようなものです。

select * from usr join vehicle on usr.id = vehicle.user_id; 

と私は戻ってUsrオブジェクト

+0

はい、その可能からあなたのResultSetを持っていますが、正確**クエリに参加何も言わなかったと言いますどのように** ResultSet **をどのクラスにマップしたいのですか? –

+0

この例では、単純な手書きのマッピングについて説明しますが、ほとんど役に立ちません。これは、まっすぐなJDBCを使用してHibernateを使用することの半分の方法です。複雑なマッピングをたくさん処理したい場合は、Hibernateを学ぶことができます。手動で処理する場合は、通常その例の助けを借りずに実行します。または、マッピングだけを行い、それを使用するフレームワークを見つけてください。 – Kayaman

+0

結果セットから 'Usr'を取得するために使用しているクエリを私に提供できますか? 'select * from usr'のようなものでしょうか?あなたのexsitingコードはマッピングを行うことができますか? –

答えて

1

にそれをマップするには、新しい方法で全体を破ることができます。あなたが従っているアプローチは便利ですが、限界があります。これは、フィールドのプリミティブ型のみを処理します。しかし、外部キーマッピングとして、db内の他のオブジェクトまたはテーブルと関連するクラスはどうでしょうか?あなたがVehicleを関連関係として持つUsrクラスを持っている場合のように。

あまりにも一般的な方法でマッピングするのではなく、マッピングロジックをクラスに書き込んでから、必要に応じて再利用することができます。

public abstract class RowMapper<E> { 

public List<E> processResultSet(ResultSet rs) throws SQLException { 
    List<E> objectList = new ArrayList<>(); 

    while(rs.next()) { 
     objectList.add(mapRow(rs)); 
    } 

    return objectList; 
} 

abstract E mapRow(ResultSet rs) throws SQLException; 

}

行のマッピングにあなたがVehicleのために別のRowMapperのを実装することができますUsrクラス

public class UsrMapper extends RowMapper<Usr> { 

    @Override 
    public State mapRow(ResultSet rs, int rowNum) throws SQLException { 

     Usr usr = new Usr(); 
     Vehicle vehicle = new Vehicle(); 

     usr.setId(rs.getInt("usr.id")); 
     vehicle.setId(rs.getInt("vehicle.id")); 
     vehicle.setYear(rs.getInt("vehicle.year")); 
     vehicle.setModel(rs.getString("vehicle.model")); 

     usr.setVehicle(vehicle); 

     return usr; 
    } 
} 

ためロジックを記述RowMapper抽象クラスを書きます同じように。今これを使うためのちょっとした方法です。

は、使用している**あなたが参加し、次のクエリ今

select usr.id, vehicle.id, vehicle.year, vehicle.model from usr join vehicle on usr.id = vehicle.user_id; 

UsrMapper usrMapper = new UsrMapper(); 
List<Usr> usrList = usrMapper.processResultSet(resultSet); 
+0

お返事ありがとうございます。私は私の質問でそれを言及すべきだった。私が本当に望んでいたのは、この例のようにすべてのマッピングを処理できる汎用マッパーメソッドです。それは可能ですか? – user1865027

+0

はい。それも可能です。しかし、私はこれがまっすぐではないだろうと恐れています。何らかの種類の注釈からのエンティティと構文解析ロジックの間のさまざまなタイプの関係をチェックする必要があります。しかし、なぜあなたは車輪を発明するのですか?標準的なORMフレームワークはすでにこの仕事を効率的に行うためにあります。あなたが純粋なJavaに固執したいからだけであれば、この** RowMapper **パターンはもっと便利な方法です。 –

+0

私は時間があるときにこれと一緒にHibernateを実装するつもりだと思います。うまくいけば、プロジェクトはあまりにも巨大になりません – user1865027

関連する問題