2016-08-30 26 views
0

私はJOOQの使用時に新しいですが、問題はありますが解決策が見つかりません。JOOQ POJOオブジェクトを別のPOJOで取得 - テーブル内の外部キー

CREATE TABLE Sellers 
(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name varchar(255) NOT NULL, 
); 


CREATE TABLE Clients 
(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name varchar(255) NOT NULL, 
seller_id int, 
FOREIGN KEY (seller_id) REFERENCES Sellers(id) 
); 

Clientforeign keyを持っており、それが彼に割り当てられているSeller定義します - 以下のSQL SellersClients:私は2つのテーブルを持つ単純なデータベースを持っています。

私はJOOQを使用してデータベースからクライアントを取得したいと思いますが、join()を使用すると、クライアントごとにSellerオブジェクトが取得されます。出来ますか?もしそうなら、それを行う方法?ここに私のPOJOオブジェクトです:

public class Seller { 
    private final SimpleIntegerProperty id = new SimpleIntegerProperty(); 
    private final SimpleStringProperty name = new SimpleStringProperty(); 

    ... 
    //setters and getters here 
    ... 
} 

public class Client { 
    private final SimpleIntegerProperty id = new SimpleIntegerProperty(); 
    private final SimpleStringProperty name = new SimpleStringProperty(); 
    private final SimpleIntegerProperty sellerId = new SimpleIntegerProperty(); 
    //private Seller seller; //not working 
    ... 
    //setters and getters here 
    ... 
} 

そして、ここでは私のJOOQコードは、クライアントを取得することです:

context.select() 
    .from(CLIENTS) 
    .join(SELLERS) 
    .on(CLIENTS.ID.eq(SELLERS.ID)) 
    .fetchInto(Client.class); 

私は私が欲しいものを得るために変更する必要がありますか?

+0

'Client'は' seller'をオブジェクトとして持っています。 DBは 'int'として' seller_id'を持っています。 JOOQはそれを自動的に解決しますか? – bradimus

+0

@bradimusそれは自動的にseller_idをintとして解決しますが、Clientクラスで見ることができるように、オブジェクト売り手の売り手を追加しようとしましたが、解決しませんでした。 – user3626048

答えて

1

Lukas Eder(jOOQの著者)と他のjOOQユーザーとの会話をチェックしてください。here Garrett Wilsonのユースケースはあなたのものとよく似ています(ClientSeller、彼はBookAuthorです)。

かなり言われていますが、デザイン上、jOOQはClientのレコード内にSellerインスタンスを自動的に水和させるように設計されていないようです。これはORMに関連する古典的なN + 1の問題です(つまり、クライアントのクエリによってトリガーされた販売者のテーブルに対する複数のクエリ)。

select * from Client where ... 
select * from Seller where id in (select seller_id from Client where ...) 

...そしてアプリケーションのどこかであなたのclient.setSeller()タイプのロジックを実行します。

1つの提案は、あなたの個別の問い合わせに合流分割することです。この場合、N + 1の問題を避け、RecordMapperタイプのカスタム書込みに頼る必要はありません。

私はjOOQの専門家だが、私は1つのクエリで返された階層型から列を持っていたとき、私が過去に使用されるアプローチは、私にとってはかなりうまくいった:

  1. にカスタムレコードマッパーを定義しますYを構成する、カスタムRecordMapperProviderを定義するドメインの種類/ POJO
  2. にごjOOQ Recordをマッピングし、前述のDSLContextを使用して
  3. (例えば依存性注入を通じて)あなたの照会を行うどんなコンポーネントに周りに渡されるDSLContextシングルトンを作成するために使用私たちのクエリおよびそれ以前の参照会話に

(ごRecordMapperProviderに計上されている必要があります)あなたのターゲット・タイプを指定するfetchInto()を使用するには、ルーカスは、カスタムRecordMapperProviderのインスタンスを使用する方法についてのマニュアルをlinkをドロップするので、これは非常に可能性がありますよく慣用である。

希望するものがあります。

関連する問題