ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
EntityManager とは
JPA の EntityManager はエンティティの永続化・検索・更新・削除を司る中核 API です。Spring Data JPA はこの EntityManager を内部で利用してリポジトリメソッドを実装しています。普段はリポジトリ経由で済みますが、複雑なクエリやネイティブ SQL を使う際に直接触ることがあります。
方式1: @PersistenceContext (推奨)
Spring 管理のコンポーネントで使う場合、これがもっとも一般的:
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class UserRepositoryImpl implements UserCustomRepository {
@PersistenceContext
private EntityManager em;
public List<User> findActiveUsersByDate(LocalDate date) {
// JPQL の動的構築
StringBuilder jpql = new StringBuilder("SELECT u FROM User u WHERE u.active = true");
if (date != null) {
jpql.append(" AND u.lastLoginAt >= :date");
}
TypedQuery<User> query = em.createQuery(jpql.toString(), User.class);
if (date != null) {
query.setParameter("date", date);
}
return query.getResultList();
}
}
方式2: EntityManagerFactory から個別取得
トランザクション境界を手動で制御したい / 非 Spring 管理のコンテキストで使う場合:
@Component
public class BatchService {
@PersistenceUnit
private EntityManagerFactory emf;
public void processBatch() {
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
// ... 処理
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
em.close(); // ★ 必ず close
}
}
}
方式3: Spring Data JPA Custom Repository
Spring Data JPA で「規約メソッドだけでは無理な処理」を追加する標準パターン:
// ① Custom インターフェイス
public interface UserCustomRepository {
List<User> findByComplexCondition(UserSearchDto dto);
}
// ② 実装クラス(命名規則: 「リポジトリ名」+ "Impl")
@Repository
public class UserCustomRepositoryImpl implements UserCustomRepository {
@PersistenceContext
private EntityManager em;
@Override
public List<User> findByComplexCondition(UserSearchDto dto) {
// CriteriaBuilder で型安全なクエリ
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
List<Predicate> predicates = new ArrayList<>();
if (dto.getName() != null) {
predicates.add(cb.like(root.get("name"), "%" + dto.getName() + "%"));
}
if (dto.getMinAge() != null) {
predicates.add(cb.ge(root.get("age"), dto.getMinAge()));
}
cq.where(cb.and(predicates.toArray(new Predicate[0])));
return em.createQuery(cq).getResultList();
}
}
// ③ JpaRepository と一緒に extend する
public interface UserRepository extends JpaRepository<User, Long>, UserCustomRepository {
// 標準のリポジトリメソッドと、カスタムメソッド両方が使える
}
EntityManager の主要メソッド
| メソッド | 用途 |
|---|---|
persist(entity) | 新規エンティティを永続化(INSERT) |
merge(entity) | デタッチ状態のエンティティを更新(UPDATE) |
remove(entity) | 削除(DELETE) |
find(Class, id) | 主キーで検索 |
getReference(Class, id) | 遅延ロード proxy を取得(実 SQL は属性アクセス時) |
flush() | 永続化コンテキストの変更を DB に反映 |
clear() | 永続化コンテキストを空に |
refresh(entity) | DB から再取得して上書き |
createQuery(jpql) | JPQL クエリ作成 |
createNativeQuery(sql) | ネイティブ SQL クエリ作成 |
createStoredProcedureQuery(name) | ストアドプロシージャ呼び出し |
ネイティブ SQL の実行
// 結果を Map で取得
List<Map<String, Object>> rows = em
.createNativeQuery("SELECT user_id, name, age FROM users WHERE age > ?")
.setParameter(1, 18)
.unwrap(NativeQueryImpl.class)
.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
.getResultList();
// 結果を Entity にマップ
List<User> users = em
.createNativeQuery("SELECT * FROM users WHERE age > ?", User.class)
.setParameter(1, 18)
.getResultList();
// スカラー値(1 列だけ)
Long count = ((Number) em
.createNativeQuery("SELECT COUNT(*) FROM users")
.getSingleResult())
.longValue();
flush と commit の違い
- flush(): 永続化コンテキストの変更を DB に送信(INSERT/UPDATE 文の実行)。まだコミットされていない
- commit(): トランザクションを確定(DB レベルで永続化)
- Spring の
@Transactionalはメソッド終了時に自動的に flush + commit - 長い処理の途中で DB へ反映確認したいときに
em.flush()を明示
パフォーマンス Tip: バッチ INSERT
@Transactional
public void bulkInsert(List<User> users) {
for (int i = 0; i < users.size(); i++) {
em.persist(users.get(i));
if (i % 50 == 0) { // 50 件ごとに flush + clear
em.flush();
em.clear(); // ★ 永続化コンテキストをクリアしてメモリ節約
}
}
}
// application.properties で JDBC バッチサイズも設定
// spring.jpa.properties.hibernate.jdbc.batch_size=50
// spring.jpa.properties.hibernate.order_inserts=true
// spring.jpa.properties.hibernate.order_updates=true
関連
- @Transactional の必要性: EntityManager で更新系を実行する場合、Service 層または同メソッドに @Transactional 必須
- QueryDSL / Criteria API: 型安全な動的クエリ構築には QueryDSL を導入する選択肢も
- JPA Specifications: Spring Data JPA 標準の動的クエリ構築機構(CriteriaBuilder ベース)
- テスト:
@DataJpaTestで EntityManager 込みのテストが可能
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?