ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?