型別轉換
基於約定的對映
當未提供額外的對映元資料時,Neo4j 轉換器有一些物件對映約定。約定如下:
-
Java 類短名稱以以下方式對映到主標籤:類
com.bigbank.SavingsAccount
對映到savingsAccount
主標籤。 -
轉換器使用在其上註冊的任何 Spring Converter 來覆蓋物件屬性到節點欄位和值的預設對映。
-
物件的欄位用於與圖中的欄位相互轉換。不使用公共的
JavaBean
屬性。 -
如果您有一個非零引數建構函式,且其引數名稱與節點的頂級屬性名稱匹配,則使用該建構函式。否則,使用零引數建構函式。如果存在多個非零引數建構函式,則會丟擲異常。
我們開箱即用地支援廣泛的型別轉換。支援的 Cypher 型別列表請參閱官方驅動手冊:型別對映。
原始型別或包裝型別也同樣支援。
領域型別 | Cypher 型別 | 直接對映到原生型別 |
---|---|---|
|
Boolean |
✔ |
|
布林型列表 |
✔ |
|
Integer |
✔ |
|
整型列表 |
✔ |
|
Float |
✔ |
|
浮點型列表 |
✔ |
|
String |
✔ |
|
字串列表 |
✔ |
|
ByteArray |
✔ |
|
長度為 1 的 ByteArray |
|
|
長度為 1 的 String |
|
|
長度為 1 的字串列表 |
|
|
格式化為 ISO 8601 日期( |
|
|
String |
|
|
字串列表 |
|
|
Integer |
|
|
整型列表 |
|
|
格式化為 BCP 47 語言標籤的字串 |
|
|
Integer |
|
|
整型列表 |
|
|
String |
|
|
String |
|
|
Date |
✔ |
|
Time |
✔ |
|
LocalTime |
✔ |
|
DateTime |
✔ |
|
LocalDateTime |
✔ |
|
DateTime |
|
|
DateTime |
|
|
String |
|
|
String |
|
|
Duration |
|
|
Duration |
|
|
Duration |
✔ |
|
Point |
✔ |
|
CRS 4326 的 Point |
|
|
CRS 4979 的 Point |
|
|
CRS 7203 的 Point |
|
|
CRS 9157 的 Point |
|
|
CRS 4326 的 Point,其中 x/y 對應於 lat/long |
|
Enum 例項 |
String(列舉的名稱值) |
|
Enum[] 例項 |
字串列表(列舉的名稱值) |
|
|
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
還提供了 converterRef
,用於引用應用上下文中實現 Neo4jPersistentPropertyConverter
的任何 Spring bean。引用 bean 會優先於構建新的轉換器。
我們提供 @DateLong
和 @DateString
作為元註解,用於與不使用原生型別的 Neo4j-OGM 方案向後相容。這些是基於上述概念構建的元註解。
複合屬性
使用 @CompositeProperty
註解,型別為 Map<String, Object>
或 Map<? extends Enum, Object>
的屬性可以作為複合屬性儲存。map 中的所有條目將作為屬性新增到包含該屬性的節點或關係中。可以帶配置的字首,或使用屬性名稱作為字首。雖然我們開箱即用只為 map 提供了此功能,但您可以實現 Neo4jPersistentPropertyToMapConverter
並將其配置為在 @CompositeProperty
上使用的轉換器。Neo4jPersistentPropertyToMapConverter
需要知道如何將給定型別分解成 map,以及如何從 map 重新組合。