【问题标题】:Spring Data Neo4j custom query list params not use converterSpring Data Neo4j 自定义查询列表参数不使用转换器
【发布时间】:2017-08-16 02:29:34
【问题描述】:

节点实体:

@NodeEntity(label = "User")
public class UserNode {
    @GraphId
    private Long _gid;

    @Index(unique = true, primary = true)
    @Convert(ObjectIdConverter.class)
    private ObjectId id;
}

转换器:

public class ObjectIdConverter implements AttributeConverter<ObjectId, String>{
    @Override
    public String toGraphProperty(ObjectId value) {
        return ObjectIdUtils.compressed(value);
    }

    @Override
    public ObjectId toEntityAttribute(String value) {
        return ObjectIdUtils.uncompress(value);
    }
}

存储库:

public interface UserNodeRepository extends GraphRepository<UserNode> {
    @Query("MATCH (user:User) WHERE user.id IN {0} RETURN user")
    List<UserNode> findByIdIn(List<ObjectId> ids);
}

UserNodeRepository#findByIdIn 是自定义查询。但是请求参数直接转成json,不使用ObjectIdConverter。

日志:

o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (user:User) WHERE user.id IN {0} RETURN user with params {0=[{timestamp=1500442853, machineIdentifier=11302907, processIdentifier=11906, counter=4709865, time=1500442853000, date=1500442853000, timeSecond=1500442853}, {timestamp=1500445335, machineIdentifier=11302907, processIdentifier=11906, counter=4709946, time=1500445335000, date=1500445335000, timeSecond=1500445335}, {timestamp=1500447522, machineIdentifier=11302907, processIdentifier=11906, counter=4710014, time=1500447522000, date=1500447522000, timeSecond=1500447522}, {timestamp=1500448399, machineIdentifier=11302907, processIdentifier=11906, counter=4710092, time=1500448399000, date=1500448399000, timeSecond=1500448399}]}

这是 SDN 的期望还是我丢失了哪些概念?

【问题讨论】:

    标签: spring-data-neo4j spring-data-neo4j-4 neo4j-ogm


    【解决方案1】:

    对于具有自定义 @Query 的查找器来说,这是不可能的。 OGM 无法知道您的参数与带有@Convert 注释的属性相关(根本不使用方法名称)。要解决此问题,请手动转换为您的属性类型并将其用作参数:

    @Query("MATCH (user:User) WHERE user.id IN {0} RETURN user")
    List<UserNode> findByIdIn(List<String> ids);
    

    但是,这对于派生的查找器来说效果很好 - OGM 从方法名称中知道该字段,以及带有正确转换器的 @Convert 注释。

    单参数示例:

    List<UserNode> findById(ObjectId id);
    

    不幸的是,IN 运算符和集合参数似乎存在错误:

    // doesn't work
    List<UserNode> findByIdIn(List<ObjectId> ids);
    

    我创建了a jira issue

    【讨论】:

    • List参数+1相同的bug。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2020-04-12
    • 2020-02-11
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多