0

おはようございます。私はこの質問に答えようとずっと探していました。

別のテーブルへの外部キーを持つテーブルがあり、両方のテーブルからの結果が必要な場合は、基本SQLを使用して、外部キーに対して内部結合を実行し、要求したすべての結果情報を取得します。外部キーでJPAエンティティを生成すると、外部キー列に@ oneTooneアノテーション、@ oneToMany、@ ManyToMany、@ManyToOneなどが追加されます。外部キーに@oneToManyがあり、関連するテーブル列の主キーに対応する@ManyToOneがあります。また、正しい列に@joinedONアノテーションがあります...最初からすべてを選択する基本的な名前付きクエリもあります。テーブル。基本的なSQLで行う必要があるように、両方のテーブルから情報を取得するために結合を行う必要がありますか?それとも、私がそれらの注釈を持っているという事実は、それらのレコードを私のために引き戻しますか?外部キーの関係に基づいてテーブルBに関連するテーブルAがあり、両方のテーブルのレコードが必要な場合は、外部キーに基づいてテーブルAからBに結合するか、

Select * From A inner Join B on A.column2 = B.column1

または他のいくつか-そのような意味がない(正確に正しくない場合は私のSQLを許してください、しかしあなたは考えを理解します)...そのクエリはAとBからすべての列を選択します私が使用している名前付きクエリ...

@NamedQuery(name="getQuickLaunch", query = "SELECT q FROM QuickLaunch q")

これが、ステートレスセッションBeanでの呼び出し方法です...

try
    {
        System.out.println("testing 1..2..3");
        listQL = emf.createNamedQuery("getQuickLaunch").getResultList();
        System.out.println("What is the size of this list: number "+listQL.size());
        qLaunchArr = listQL.toArray(new QuickLaunch[listQL.size()]);            

    }

この呼び出しはテーブルAのすべての列を返しますが、テーブルBの列が不足しています。私の最初の本能は、クエリを変更して2つのテーブルを結合することです...しかし、そのようなものを使用することのポイントは何であるかを考えさせられますJPAの場合、とにかく別の場所で作成するのと同じクエリを作成するだけです。さらに、私は単純なものを見落としたくありません。では、オーバーフロー愛好家をスタックするとはどういうことですか?JPAを使用して結合されたクエリのすべてのデータを取得するにはどうすればよいですか?

4

1 に答える 1

1

ContactエンティティにOneToManyアソシエーションを持つPersonエンティティがあるとします。

entityManagerからPersonを取得すると、連絡先のコレクションで任意のメソッドを呼び出すと、その個人の連絡先のリストが遅延ロードされます。

person.getContacts().size();
// triggers a query select * from contact c where c.personId = ?

単一のクエリを使用して個人とそのすべての連絡先をロードする場合はfetch、SQLクエリに次のものが必要です。

select p from Person p 
left join fetch p.contacts
where ...

を使用して、関連付け自体をeager-loadedとしてマークすることもできますが、その@OneToMany(lazy = false)場合、人が読み込まれるたびに(vieem.find()またはクエリ)、その連絡先も読み込まれます。

于 2012-04-16T14:00:26.497 に答える