Spring Data Neo4j 自定义查询列表参数不使用转换器
Spring Data Neo4j custom query list params not use converter
节点实体:
@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的期待还是我丢掉了什么概念?
这对于具有自定义 @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。
节点实体:
@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的期待还是我丢掉了什么概念?
这对于具有自定义 @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。