Neo4j需要一个id字段才能工作,类型为Long。这适用于Spring数据neo4j。我想有另一个类型为UUID的字段,并且使用T findOne(T id)来处理我的UUID而不是neo生成的ID。
当我使用Spring Data Rest时,我不想在URL中公开neo的id。
http://localhost:8080/resource/ {neoId}
到
http://localhost:8080/resource/ {UUID}
如果有可能,有什么想法吗?
已更新
{
name: "Root",
resourceId: "00671e1a-4053-4a68-9c59-f870915e3257",
_links: {
self: {
href: "http://localhost:8080/resource/9750"
},
parents: {
href: "http://localhost:8080/resource/9750/parents"
},
children: {
href: "http://localhost:8080/resource/9750/children"
}
}
}
答案 0 :(得分:2)
当涉及到存储库中的finder方法时,您可以自行覆盖您自己界面中CrudRepository
中提供的方法,或者提供可能为T findByUuid(Long uuid)
的替代方法。
根据您对类的建模方式,您可以依赖方法名称中的派生查询,也可以使用查询进行注释,例如:
@Query(value = "MATCH (n:YourNodeType{uuid:{0}) RETURN n")
如果您要使用特定的UUID类,那么您需要告诉Neo如何保留UUID值。如果你将它存储为一个字符串(似乎合理),那么我相信没有必要注释该字段,其他任何东西你需要GraphProperty
注释:
@GraphProperty(propertyType = Long.class)
再次根据UUID的类,您可能需要使用Spring注册转换类,该类实现org.springframework.core.convert.converter.Converter
接口并在您的域类类型(UUID)和存储类型(String)之间进行转换。
或者,只需将UUID转换为字符串并自行存储,不用担心所有转换。
无论您做什么,请确保您的新uuid
已被编入索引并且可能是唯一的。
答案 1 :(得分:0)
您可以向实体添加 String 属性,将其命名为 uuid ,然后在您的实体中声明 E findByUuid(String uuid) E 的存储库,Spring Data将自动为其生成代码。 例如:
@NodeEntity
public class Entity {
...
@Indexed
private String uuid;
...
public String getUuid() {
return uuid;
}
void setUuid(String uuid) {
this.uuid = uuid;
}
...
}
public interface EntityRepository extends GraphRepository<Entity> {
...
Entity findByUuid(String uuid);
...
}