如何使用 Neo4J OGM 过滤自定义实体类型的 class 字段?
How to filter for a class field of a custom entity type with Neo4J OGM?
我正在使用自定义实体类型:
@NodeEntity
class SutStateEntity(state: SutState) extends Entity {
def this() = this(null)
@Convert(classOf[SutStateConverter])
val sutState = state
}
现在我想获得一个与 class 字段 sutState 相匹配的实体。
请注意,类型 SutState 必须由我的自定义转换器 SutStateConverter 转换,因为它不是 Neo4J OGM 支持的原始类型。
这是我用来过滤匹配实体的代码:
val filter = new Filter("sutState", ComparisonOperator.EQUALS, sutState)
val first = session.loadAll(classOf[SutStateEntity], filter).stream().findFirst()
但是,此代码会导致以下异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: No serializer found for class de.retest.recheck.ui.descriptors.StringAttribute and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["sutState_0"]->de.retest.recheck.ui.descriptors.SutState["rootElements"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.RootElement["identifyingAttributes"]->de.retest.recheck.ui.descriptors.IdentifyingAttributes["attributes"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.StringAttribute["type"])
StringAttribute是SutState存储的实例字段的类型。
它有像 SutState XML 注释,SutStateConverter 能够毫无问题地编组和解组它(通过自定义单元测试验证)。
Neo4J OGM 不为我的过滤器使用转换器吗?
如何为 class 字段 sutState 指定过滤器?
这是我的自定义转换器的代码:
class SutStateConverter extends AttributeConverter[SutState, String] {
def toGraphProperty(value: SutState): String = XmlTransformerUtil.getXmlTransformer.toXML(value)
def toEntityAttribute(value: String): SutState =
XmlTransformerUtil.getXmlTransformer.fromXML[SutState](new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)))
}
XmlTransformerUtil.getXmlTransformer.toXML 和 XmlTransformerUtil.getXmlTransformer.fromXML 将 SutStates 编组和解组到 XML。
class 已经在单元测试中进行了测试,应该可以工作。
您的假设是正确的:Neo4j-OGM 不使用转换器。
这是因为过滤器通常不绑定到特殊实体 class,但转换器绑定到实体 class 的 属性。
在 loadAll
调用中将过滤器应用于特定实体时没有任何魔力,然后会检查 属性 是否绑定了转换器。
最简单的方法是手动创建一个转换器实例,然后将 toGraphProperty
方法应用于您提供的过滤器值。
一个(也许)更简洁的方法可能是扩展 Filter
class 和类似 SutStateFilter
的东西,如果你需要创建一个过滤器这 属性 更频繁。
我正在使用自定义实体类型:
@NodeEntity
class SutStateEntity(state: SutState) extends Entity {
def this() = this(null)
@Convert(classOf[SutStateConverter])
val sutState = state
}
现在我想获得一个与 class 字段 sutState 相匹配的实体。 请注意,类型 SutState 必须由我的自定义转换器 SutStateConverter 转换,因为它不是 Neo4J OGM 支持的原始类型。
这是我用来过滤匹配实体的代码:
val filter = new Filter("sutState", ComparisonOperator.EQUALS, sutState)
val first = session.loadAll(classOf[SutStateEntity], filter).stream().findFirst()
但是,此代码会导致以下异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: No serializer found for class de.retest.recheck.ui.descriptors.StringAttribute and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["sutState_0"]->de.retest.recheck.ui.descriptors.SutState["rootElements"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.RootElement["identifyingAttributes"]->de.retest.recheck.ui.descriptors.IdentifyingAttributes["attributes"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.StringAttribute["type"])
StringAttribute是SutState存储的实例字段的类型。 它有像 SutState XML 注释,SutStateConverter 能够毫无问题地编组和解组它(通过自定义单元测试验证)。
Neo4J OGM 不为我的过滤器使用转换器吗? 如何为 class 字段 sutState 指定过滤器?
这是我的自定义转换器的代码:
class SutStateConverter extends AttributeConverter[SutState, String] {
def toGraphProperty(value: SutState): String = XmlTransformerUtil.getXmlTransformer.toXML(value)
def toEntityAttribute(value: String): SutState =
XmlTransformerUtil.getXmlTransformer.fromXML[SutState](new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)))
}
XmlTransformerUtil.getXmlTransformer.toXML 和 XmlTransformerUtil.getXmlTransformer.fromXML 将 SutStates 编组和解组到 XML。 class 已经在单元测试中进行了测试,应该可以工作。
您的假设是正确的:Neo4j-OGM 不使用转换器。
这是因为过滤器通常不绑定到特殊实体 class,但转换器绑定到实体 class 的 属性。
在 loadAll
调用中将过滤器应用于特定实体时没有任何魔力,然后会检查 属性 是否绑定了转换器。
最简单的方法是手动创建一个转换器实例,然后将 toGraphProperty
方法应用于您提供的过滤器值。
一个(也许)更简洁的方法可能是扩展 Filter
class 和类似 SutStateFilter
的东西,如果你需要创建一个过滤器这 属性 更频繁。