【问题标题】:How to filter for a class field of a custom entity type with Neo4J OGM?如何使用 Neo4J OGM 过滤自定义实体类型的类字段?
【发布时间】:2019-03-27 13:12:37
【问题描述】:

我正在使用自定义实体类型:

@NodeEntity
class SutStateEntity(state: SutState) extends Entity {

  def this() = this(null)

  @Convert(classOf[SutStateConverter])
  val sutState = state
}

现在我想获得一个与类字段 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$1 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 不使用转换器作为我的过滤器吗? 如何为类字段 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 和从 XML 解组。 该类已在单元测试中进行了测试,应该可以工作。

【问题讨论】:

    标签: scala neo4j neo4j-ogm


    【解决方案1】:

    您的假设是正确的:Neo4j-OGM 不使用转换器。 这是因为过滤器通常不绑定到特殊的实体类,但转换器绑定到实体类的属性。 在 loadAll 调用中对特定实体应用过滤器并检查该属性是否绑定了转换器时,没有任何魔法。

    最简单的方法是手动创建转换器实例并将toGraphProperty 方法应用于您提供的过滤器值。

    如果您需要更频繁地为此属性创建过滤器,一种(也许)更简洁的方法可能是使用类似 SutStateFilter 的东西扩展 Filter 类。

    【讨论】:

    • 有一个方法Filter.setPropertyConverter。会有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多