JPAでwhereステートメントを処理するための好ましい方法について疑問に思っています。
2つの方法があります。
次のような条件クエリを使用します
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Profile> c = cb.createQuery(Profile.class);
Root<Profile> root = c.from(Profile.class);
c.where(cb.equal(root.get(Profile_.email), email));
List<Profile> resultList = em.createQuery(c).getResultList();
または、テーブル全体を選択して、Javaで繰り返します。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Profile> c = cb.createQuery(Profile.class);
// Root<Profile> root = c.from(Profile.class);
// c.where(cb.equal(root.get(Profile_.email), email));
List<Profile> resultList = em.createQuery(c).getResultList();
for (Profile profile : resultList) {
if (profile.getEmail().equals(email)) {
//todo
}
}
推奨される方法は何ですか?また、どの長所と短所がありますか?
最初のケースで結果として得られる選択は、2番目のケースでのインスタンスのフィルタリングよりも桁違いに高速に実行できます。
データベースはデータの選択において非常に高速で効率的であるため、最初のアプローチの欠点を認識していません。
2番目の方法の短所は、最初のアプローチを使用するときに実行する必要のないタスクです。
テーブル内のすべてのオブジェクトをインスタンス化する必要があります。レコードの数によっては、これは非常に高額になる可能性があり、最終的にはVMのメモリ制限を破裂させます。
すべてのオブジェクトを繰り返し、いくつかのメソッドを呼び出し、比較を行い、不要なインスタンスをガベージコレクションする必要があります。これも時間とリソースの浪費です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加