|
此版本仍在开发中,目前尚不被视为稳定版本。如需最新稳定版本,请使用 Spring Data Neo4j 8.0.4! |
转换
基于约定的映射
Neo4j 转换器在未提供额外映射元数据时,具有一系列用于映射对象的约定。这些约定包括:
-
以下方式将短Java类名映射到主要标签: 类
com.bigbank.SavingsAccount映射到savingsAccount主要标签。 -
转换器会使用任何与之注册的 Spring 转换器,以覆盖对象属性到节点字段和值的默认映射。
-
对象的字段用于在对象与图中的字段之间进行转换。
公共
JavaBean属性不被使用。 -
如果您有一个单个非零参数构造函数,且其构造函数参数名称与节点的顶层属性名称匹配,则使用该构造函数。否则,将使用无参构造函数。如果存在多个非零参数构造函数,则会抛出异常。
我们开箱即用地支持广泛的转换。
在官方驱动程序手册中查找支持的加密类型列表:类型映射。
原始类型和包装类型均得到同等支持。
| 域名类型 | Cypher type | 映射到原生类型 |
|---|---|---|
|
布尔值 |
✔ |
|
布尔值列表 |
✔ |
|
整数 |
✔ |
|
List of Integer |
✔ |
|
浮动 |
✔ |
|
浮点数列表 |
✔ |
|
字符串 |
✔ |
|
字符串列表 |
✔ |
|
字节数组 |
✔ |
|
带有长度为 1 的字节数组 |
|
|
String with length 1 |
|
|
List of String with length 1 |
|
|
格式化为ISO 8601日期( 请注意 如果您需要时区,请使用支持它的类型(如 |
|
|
字符串 |
|
|
字符串列表 |
|
|
整数 |
|
|
List of Integer |
|
|
字符串按 BCP 47 语言标签格式化 |
|
|
整数 |
|
|
List of Integer |
|
|
字符串 |
|
|
字符串 |
|
|
日期 |
✔ |
|
时间 |
✔ |
|
本地时间 |
✔ |
|
日期时间 |
✔ |
|
localDateTime |
✔ |
|
日期时间 |
|
|
日期时间 |
|
|
字符串 |
|
|
字符串 |
|
|
持续时间 |
|
|
持续时间 |
|
|
持续时间 |
✔ |
|
点 |
✔ |
|
点(经 CRS 4326) |
|
|
带 CRS 4979 的点 |
|
|
点带有 CRS 7203 |
|
|
点(经CRS 9157) |
|
|
具有 CRS 4326 和与 lat/long 对应的 x/y 的点 |
|
|
persisted through |
|
在Spring框架中,实例化的对象可以使用以下方法:
以下是使用Spring框架的一些常见场景:
|
String(枚举的name值)<br/> |
|
在Spring框架中,实例化的对象可以使用以下方法:
以下是使用Spring框架的一些常见场景:
|
字符串列表(枚举的名称值) |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
向量类型
Spring Data 使用其自身的类型表示向量 org.springframework.data.domain.Vector。
虽然可以将其用作 float 或 double 数组的包装器,但目前 Spring Data Neo4j 只支持 double 变体。
从用户的角度来看,在属性定义上仅可能定义 Vector 接口,并使用 double 或 float。
Neo4j 将存储 double 和 float 变体作为 64 位 Cypher FLOAT 值,这与通过 Cypher 和专门用于持久化属性的 setNodeVectorProperty 函数保存的值一致。
Spring Data Neo4j 在实体定义中仅允许存在一个 Vector 属性。 |
请注意,由于浮点数的特性,持久化的 float 值与读取回来的值是不同的。 |
自定义转换
对于给定类型的属性
如果您希望在实体中使用自己的类型或作为@Query注解方法的参数,您可以定义并提供自定义转换器实现。首先您必须实现一个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中。为此,您必须创建一个类型为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 方案。
这些是基于上述概念构建的元注解注释。