此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Neo4j 7.4.4!

转换

基于约定的映射

Neo4j 转换器在未提供其他映射元数据时具有一些用于映射对象的约定。 约定是:

  • 短 Java 类名按以下方式映射到主标签: 类com.bigbank.SavingsAccount映射到savingsAccount主标签。

  • 该转换器使用向其注册的任何 Spring Converter 来覆盖对象属性到节点字段和值的默认 Map。

  • 对象的字段用于与图形中的字段相互转换。 公共JavaBean属性。

  • 如果你有一个非零参数的构造函数,其构造函数参数名称与 node 的顶级属性名称匹配,则使用该构造函数。 否则,使用零参数构造函数。 如果有多个非零参数构造函数,则会引发异常。

我们支持各种开箱即用的转换。 在官方驱动程序手册中找到支持的密码类型列表:Type mapping

同样支持包装器类型的基元类型。

域类型 密码类型 直接映射到本机类型

java.lang.Boolean

布尔

boolean[]

布尔值列表

java.lang.Long

整数

long[]

整数列表

java.lang.Double

double[]

浮点数列表

java.lang.String

字符串

java.lang.String[]

字符串列表

byte[]

字节数组

java.lang.Byte

长度为 1 的 ByteArray

java.lang.Character

长度为 1 的字符串

char[]

长度为 1 的 String 列表

java.util.Date

格式为 ISO 8601 日期 (yyyy-MM-dd’T’HH:mm:ss.SSSZ). 请注意Z:SDN 将存储所有java.util.Date中的 实例UTC. 如果需要时区,请使用支持它的类型(即ZoneDateTime) 或将区域存储为单独的属性。

java.lang.Float

字符串

float[]

字符串列表

java.lang.Integer

整数

int[]

整数列表

java.util.Locale

格式为 BCP 47 语言标记的字符串

java.lang.Short

整数

short[]

整数列表

java.math.BigDecimal

字符串

java.math.BigInteger

字符串

java.time.LocalDate

日期

java.time.OffsetTime

时间

java.time.LocalTime

本地时间

java.time.ZonedDateTime

日期时间

java.time.LocalDateTime

本地日期时间

java.time.OffsetDateTime

日期时间

java.time.Instant

日期时间

java.util.TimeZone

字符串

java.time.ZoneId

字符串

java.time.Period

期间

java.time.Duration

期间

org.neo4j.driver.types.IsoDuration

期间

org.neo4j.driver.types.Point

org.springframework.data.neo4j.types.GeographicPoint2d

CRS 4326 的点

org.springframework.data.neo4j.types.GeographicPoint3d

CRS 4979 的要点

org.springframework.data.neo4j.types.CartesianPoint2d

带有 CRS 7203 的尖头

org.springframework.data.neo4j.types.CartesianPoint3d

带有 CRS 9157 的尖

org.springframework.data.geo.Point

CRS 为 4326 且 x/y 对应于纬度/经度的点

的实例Enum

String (枚举的 name 值)

的实例Enum[]

String 列表(枚举的 name 值)

java.net.URL

字符串

java.net.URI

字符串

java.util.UUID

字符串

自定义转化

对于给定类型的属性

如果您更喜欢在实体中使用自己的类型,或者将其作为@Queryannotated methods,您可以定义和提供自定义 converter 实现。 首先,您必须实现一个GenericConverter并注册您的转换器应该处理的类型。 对于实体属性类型转换器,您需要注意将类型与 Neo4j Java 驱动程序相互转换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. 为此,您必须创建一个@Beanorg.springframework.data.neo4j.core.convert.Neo4jConversions. 否则,Neo4jConversions将仅使用内部默认转换器在后台创建。

自定义转换器实现示例
@Bean
public Neo4jConversions neo4jConversions() {
	Set<GenericConverter> additionalConverters = Collections.singleton(new MyCustomTypeConverter());
	return new Neo4jConversions(additionalConverters);
}

如果您的应用程序中需要多个转换器,您可以在Neo4jConversions构造 函数。

仅适用于特定属性

如果您只需要某些特定属性的转化,我们提供@ConvertWith. 这是一个可以放在两个实体的属性 (@Node) 和关系属性 (@RelationshipProperties) 它定义了一个Neo4jPersistentPropertyConverter通过converter属性 和可选的Neo4jPersistentPropertyConverterFactory构造前者。 通过Neo4jPersistentPropertyConverter可以处理给定类型的所有特定转换。 另外@ConvertWith还提供converterRef用于引用应用程序上下文中的任何 Spring Bean 实现Neo4jPersistentPropertyConverter.引用的 bean 将优先于构建新的转换器。

我们提供@DateLong@DateString作为元注释注释,以便向后兼容不使用本机类型的 Neo4j-OGM 方案。 这些是建立在上述概念之上的元注释。

复合特性

@CompositeProperty、类型Map<String, Object>Map<? extends Enum, Object>可以存储为复合属性。 映射中的所有条目都将作为属性添加到包含该属性的节点或关系中。 使用配置的前缀或以属性名称为前缀。 虽然我们只为地图提供开箱即用的功能,但您可以Neo4jPersistentPropertyToMapConverter并对其进行配置 作为要使用的转换器@CompositeProperty.一个Neo4jPersistentPropertyToMapConverter需要知道给定类型如何 分解为 map 并从 map 组合回来。


APP信息