型別轉換

基於約定的對映

當未提供額外的對映元資料時,Neo4j 轉換器有一些物件對映約定。約定如下:

  • Java 類短名稱以以下方式對映到主標籤:類 com.bigbank.SavingsAccount 對映到 savingsAccount 主標籤。

  • 轉換器使用在其上註冊的任何 Spring Converter 來覆蓋物件屬性到節點欄位和值的預設對映。

  • 物件的欄位用於與圖中的欄位相互轉換。不使用公共的 JavaBean 屬性。

  • 如果您有一個非零引數建構函式,且其引數名稱與節點的頂級屬性名稱匹配,則使用該建構函式。否則,使用零引數建構函式。如果存在多個非零引數建構函式,則會丟擲異常。

我們開箱即用地支援廣泛的型別轉換。支援的 Cypher 型別列表請參閱官方驅動手冊:型別對映

原始型別或包裝型別也同樣支援。

領域型別 Cypher 型別 直接對映到原生型別

java.lang.Boolean

Boolean

boolean[]

布林型列表

java.lang.Long

Integer

long[]

整型列表

java.lang.Double

Float

double[]

浮點型列表

java.lang.String

String

java.lang.String[]

字串列表

byte[]

ByteArray

java.lang.Byte

長度為 1 的 ByteArray

java.lang.Character

長度為 1 的 String

char[]

長度為 1 的字串列表

java.util.Date

格式化為 ISO 8601 日期(yyyy-MM-dd’T’HH:mm:ss.SSSZ)的字串。注意 Z:SDN 會將所有 java.util.Date 例項儲存為 UTC 時間。如果您需要時區,請使用支援時區的型別(例如 ZoneDateTime)或將時區儲存為單獨的屬性。

java.lang.Float

String

float[]

字串列表

java.lang.Integer

Integer

int[]

整型列表

java.util.Locale

格式化為 BCP 47 語言標籤的字串

java.lang.Short

Integer

short[]

整型列表

java.math.BigDecimal

String

java.math.BigInteger

String

java.time.LocalDate

Date

java.time.OffsetTime

Time

java.time.LocalTime

LocalTime

java.time.ZonedDateTime

DateTime

java.time.LocalDateTime

LocalDateTime

java.time.OffsetDateTime

DateTime

java.time.Instant

DateTime

java.util.TimeZone

String

java.time.ZoneId

String

java.time.Period

Duration

java.time.Duration

Duration

org.neo4j.driver.types.IsoDuration

Duration

org.neo4j.driver.types.Point

Point

org.springframework.data.neo4j.types.GeographicPoint2d

CRS 4326 的 Point

org.springframework.data.neo4j.types.GeographicPoint3d

CRS 4979 的 Point

org.springframework.data.neo4j.types.CartesianPoint2d

CRS 7203 的 Point

org.springframework.data.neo4j.types.CartesianPoint3d

CRS 9157 的 Point

org.springframework.data.geo.Point

CRS 4326 的 Point,其中 x/y 對應於 lat/long

Enum 例項

String(列舉的名稱值)

Enum[] 例項

字串列表(列舉的名稱值)

java.net.URL

String

java.net.URI

String

java.util.UUID

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 重新組合。