変換
規約ベースのマッピング
Neo4j コンバーターには、追加のマッピングメタデータが提供されない場合にオブジェクトをマッピングするためのいくつかの規則があります。規約は次のとおりです。
短い Java クラス名は、次の方法でプライマリラベルにマップされます。クラス
com.bigbank.SavingsAccount
は、savingsAccount
プライマリラベルにマップされます。コンバーターは、登録されている Spring コンバーターを使用して、オブジェクトプロパティのノードフィールドおよび値へのデフォルトのマッピングをオーバーライドします。
オブジェクトのフィールドは、グラフ内のフィールドとの間の変換に使用されます。パブリック
JavaBean
プロパティは使用されません。コンストラクター引数名がノードのトップレベルのプロパティ名と一致する非ゼロ引数のコンストラクターが 1 つある場合、そのコンストラクターが使用されます。それ以外の場合は、引数なしのコンストラクターが使用されます。引数がゼロではないコンストラクターが複数ある場合、例外がスローされます。
すぐに使える幅広い変換をサポートします。公式ドライバーマニュアルでサポートされている暗号型のリストを見つけてください: 型マッピング (英語) 。
ラッパー型のプリミティブ型も同様にサポートされます。
ドメインの種類 | 暗号の種類 | ネイティブ型に直接マッピングします |
---|---|---|
| Boolean | ✔ |
| ブール値のリスト | ✔ |
| 整数 | ✔ |
| 整数のリスト | ✔ |
| フロート | ✔ |
| フロート一覧 | ✔ |
| String | ✔ |
| 文字列のリスト | ✔ |
| ByteArray | ✔ |
| 長さ 1 の ByteArray | |
| 長さ 1 の文字列 | |
| 長さ 1 の文字列のリスト | |
| ISO 8601 日付 ( | |
| String | |
| 文字列のリスト | |
| 整数 | |
| 整数のリスト | |
| BCP 47 言語タグとしてフォーマットされた文字列 | |
| 整数 | |
| 整数のリスト | |
| String | |
| String | |
| 日付 | ✔ |
| 時間 | ✔ |
| LocalTime | ✔ |
| 日時 | ✔ |
| LocalDateTime | ✔ |
| 日時 | |
| 日時 | |
| String | |
| String | |
| 持続時間 | |
| 持続時間 | |
| 持続時間 | ✔ |
| ポイント | ✔ |
| CRS 4326 のポイント | |
| CRS 4979 のポイント | |
| CRS 7203 のポイント | |
| CRS 9157 のポイント | |
| CRS 4326 と緯度 / 経度に対応する x/y を持つポイント | |
| String (列挙型の名前の値) | |
| 文字列のリスト (列挙型の名前の値) | |
| String | |
| String | |
| String |
カスタム変換
特定の型の属性の場合
エンティティ内で独自の型を操作する場合、または @Query
アノテーション付きメソッドのパラメーターとして独自の型を操作する場合は、カスタムコンバーター実装を定義して提供できます。まず、GenericConverter
を実装し、コンバーターが処理する必要がある型を登録する必要があります。エンティティプロパティの型コンバーターの場合、型を Neo4j Java Driver Value
との間で変換する必要があります。コンバーターがリポジトリ内のカスタムクエリメソッドでのみ動作することを想定している場合は、Value
型への一方向変換を提供するだけで十分です。
public class MyCustomTypeConverter implements GenericConverter {
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
Set<ConvertiblePair> convertiblePairs = new HashSet<>();
convertiblePairs.add(new ConvertiblePair(MyCustomType.class, Value.class));
convertiblePairs.add(new ConvertiblePair(Value.class, MyCustomType.class));
return convertiblePairs;
}
@Override
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
if (MyCustomType.class.isAssignableFrom(sourceType.getType())) {
// convert to Neo4j Driver Value
return convertToNeo4jValue(source);
} else {
// convert to MyCustomType
return convertToMyCustomType(source);
}
}
}
SDN にコンバーターを認識させるには、コンバーターを Neo4jConversions
に登録する必要があります。これを行うには、org.springframework.data.neo4j.core.convert.Neo4jConversions
型の @Bean
を作成する必要があります。それ以外の場合、Neo4jConversions
は内部のデフォルトコンバーターのみを使用してバックグラウンドで作成されます。
@Bean
public Neo4jConversions neo4jConversions() {
Set<GenericConverter> additionalConverters = Collections.singleton(new MyCustomTypeConverter());
return new Neo4jConversions(additionalConverters);
}
アプリケーションで複数のコンバーターが必要な場合は、Neo4jConversions
コンストラクターに必要な数だけコンバーターを追加できます。
特定の属性のみ
一部の特定の属性のみの変換が必要な場合は、@ConvertWith
が提供されます。これは、エンティティ (@Node
) と関連プロパティ (@RelationshipProperties
) の両方の属性に付けることができるアノテーションです。これは、converter
属性を介して Neo4jPersistentPropertyConverter
を定義し、前者を構築するオプションの Neo4jPersistentPropertyConverterFactory
を定義します。Neo4jPersistentPropertyConverter
の実装により、特定の型のすべての特定の変換に対処できます。さらに、@ConvertWith
は、Neo4jPersistentPropertyConverter
を実装するアプリケーションコンテキストで Spring Bean を参照するための converterRef
も提供します。新しいコンバーターを構築するよりも、参照されている Bean が優先されます。
ネイティブ型を使用しない Neo4j-OGM スキームとの下位互換性のために、メタアノテーション付きアノテーションとして @DateLong
および @DateString
を提供します。これらは、上記の概念に基づいて構築されたメタアノテーション付きのアノテーションです。
複合プロパティ
@CompositeProperty
を使用すると、型 Map<String, Object>
または Map<? extends Enum, Object>
の属性を複合プロパティとして保存できます。マップ内のすべてのエントリは、プロパティを含むノードまたはリレーションシップにプロパティとして追加されます。構成済みの接頭辞を付けるか、プロパティの名前を接頭辞として付けます。この機能はすぐに使用できるマップに対してのみ提供されますが、Neo4jPersistentPropertyToMapConverter
を、@CompositeProperty
で使用するコンバーターとして構成することができます。Neo4jPersistentPropertyToMapConverter
は、特定の型をマップに分解し、マップから再構成する方法を知る必要があります。