jimmer-orm について
Jimmer ORM でのエンティティ定義やクエリ作成を支援する、Kotlin および Java 開発者向けスキルです。インターフェースベースの不変エンティティと、動的な述語や結合を扱う型安全な DSL を重視します。
主な機能
- 01インターフェース型不変エンティティの指針
- 02Kotlin 専用 API の案内
- 03型安全な SQL DSL クエリ
- 04動的な述語とテーブル結合
- 05関連マッピングとアノテーション
- 06エンティティ、DTO、クエリの資料
活用シーン
- 01Jimmer のエンティティインターフェースを定義
- 02エンティティ関連とデータベース列をマッピング
- 03条件付き述語でクエリを作成
- 04エンティティを返す API の投影を選択
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ coooolfan/ unirhy --skill jimmer-ormインストール後、Claude Code で/jimmer-ormを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/EntityTemplate.ktreferences/dsl-queries.mddto.mdentity-mapping.md詳細
事実の根拠
現在のコンテキストで Jimmer プロジェクトのソースコードのローカルパスが指定されている場合は、ソースコードの実装を基準にしてください。それ以外の理由で Jimmer の具体的な実装を確認する必要がある場合は、コードリポジトリ https://github.com/babyfish-ct/jimmer を参照してください。
コアコンセプト
エンティティ定義の特徴
- class ではなく interface でエンティティを定義します
- エンティティは動的オブジェクトであり、不変オブジェクトです
- getter のみを持ち、setter はありません
- KSP(Kotlin)または AnnotationProcessor(Java)によって、コンパイル時に実装が生成されます
- プロパティが未設定であることは、null であることを意味しません
DSL クエリの特徴
- コンパイル時の安全性を保証する、強い型付けの SQL DSL です
- 動的述語:パラメーターに応じて SQL 条件を追加するかどうかを決定します
- 動的テーブル結合:未使用の結合は自動的に無視され、競合する結合は自動的に統合されます
- 暗黙的なサブクエリ:コレクション関連に基づいてサブクエリを作成し、親子の関連条件を自動的に生成します
言語の選択
Jimmer は Kotlin 向けに特化した API スタイルを提供しています
- エンティティマッピング:
references/entity-mapping.mdを参照してください - DSL クエリ:
references/dsl-queries.mdを参照してください - エンティティテンプレート:
assets/EntityTemplate.ktを参照してください
主要アノテーション早見表
@Entity- エンティティ型を指定します@MappedSuperclass- マッピングされた親インターフェースを指定し、共通フィールドを再利用します@Embeddable- 埋め込み値オブジェクトを指定します@Id- 主キーを指定します@GeneratedValue- 主キーの生成戦略を指定します@Key- ビジネスキーを指定します@ManyToOne/@OneToMany/@ManyToMany/@OneToOne- 関連マッピングを指定します@ManyToManyView- 中間エンティティを介して多対多ビューを公開します@IdView- 関連 ID ビューを指定します@JoinColumn- 外部キー列名をカスタマイズします@JoinTable- 中間テーブルをカスタマイズします@Column- 列名をカスタマイズします(関連フィールド以外にのみ使用)@Table- テーブル名をカスタマイズします@Version- 楽観ロックのバージョンフィールドを指定します@LogicalDeleted- 論理削除フィールドを指定します@Formula/@Transient- 計算プロパティを指定します?(Kotlin)- null 許容プロパティを指定します
命名規則
- エンティティ名 → テーブル名:
BookStore→BOOK_STORE - プロパティ名 → 列名:
firstName→FIRST_NAME - 多対一の外部キー:
store→STORE_ID
ワークフロー
-
エンティティを定義するとき:
- class ではなく interface を使用します
- プロジェクトの言語に応じたエンティティテンプレートとマッピングドキュメントを参照します
- 中間テーブルに順序、時刻、出典などの業務フィールドがある場合は、中間エンティティを定義し、
@ManyToManyViewで読み取り専用の多対多ビューを公開します - 外部キーで直接クエリする、または input に書き込む必要がある場合は、関連に
@IdViewを追加することを優先します assets/EntityTemplate.ktとreferences/entity-mapping.mdを参照します- DTO の定義については
references/dto.mdを参照します
-
クエリを記述するとき:
- 動的述語を優先して使用します(Kotlin:
`ilike?`/`between?`/`valueIn?`) - 単一値の関連クエリには動的テーブル結合を使用します
- コレクション JOIN による結果の重複やページネーションの無効化を避けるため、コレクション関連には暗黙的なサブクエリを使用します
- API がエンティティを返す場合は、fetcher/DTO を使用して投影を制御し、デフォルトのシリアライズ形式に依存しないでください
- プロジェクトの言語に応じた DSL クエリドキュメントを参照します
references/dsl-queries.mdを参照します
- 動的述語を優先して使用します(Kotlin:
-
問題が発生したとき:
- エンティティが interface で定義されているか確認します
- 関連マッピングの
mappedBy設定を確認します - 動的述語のパラメーターが正しいか確認します
- テーブル結合のパスが正しいことを確認します
コメント
Markdown 対応