将 Cypher 查询结果映射到 DTO
Map Cypher query result to DTO
我想将密码查询结果映射到 DTO/POJO class。我在 neo4j 中定义了以下实体:
- Products ,具有属性;姓名、职务、地址
- 卖家,有房产;姓名、身份证
- Listings,有属性;姓名、身份证
关系定义为:产品 -> 卖家和卖家 -> 列表
我的查询结果是List of Product.Name, [ {Listings.Name, Listings.Id, Sellers.Id, Sellers.Name} ]
。
我希望将其映射到 DTO,我无法将具有不同节点和标签的结果映射到 DTO/POJO class.
正如您已经注意到的,Spring Data Neo4j 在映射不能直接应用于一个域实体的“任意”数据时更加严格。
但另一方面 Spring Data Neo4j 也提供了对映射松散数据的支持 Neo4jClient
。
示例:
class SoldProductInformation {
String productName;
Set<SellingInformation> sellingInformation;
}
class SellingInformation {
String listingsName;
String listingsId;
String sellerName;
String sellerId
}
neo4jClient.query("...return product.name as productName, someListWithTheInformationFromTheQuestion")
.fetchAs(SoldProductInformation.class)
.mappedBy((TypeSystem t, Record record) -> {
String productName = record.get("productName").asString();
List<SellingInformation> sellingInformations = record.get("someListWithTheInformationFromTheQuestion").asList(value -> {
String listingsName = value.get("listingsName").asString();
// same for listingsId, sellerName, sellerId...
return new SellingInformation(....);
});
return new SoldProductInformation(....);
})
如果你有更多的实体对齐字段 and/or 也许 return 还有节点,你可以使用派生映射函数:
BiFunction<TypeSystem, MapAccessor, Product> mappingFunction = neo4jMappingContext.getRequiredMappingFunctionFor(Product.class);
并通过
应用
neo4jClient.query("...return product,...")
.fetchAs(SoldProductInformation.class)
.mappedBy((TypeSystem t, Record record) -> {
Product product = mappingFunction.apply(typeSystem, record.get("product"));
String productName = product.getName();
// ....
有关完整示例,请参阅 https://github.com/spring-projects/spring-data-neo4j/issues/2288#issuecomment-861255508。
我想将密码查询结果映射到 DTO/POJO class。我在 neo4j 中定义了以下实体:
- Products ,具有属性;姓名、职务、地址
- 卖家,有房产;姓名、身份证
- Listings,有属性;姓名、身份证
关系定义为:产品 -> 卖家和卖家 -> 列表
我的查询结果是List of Product.Name, [ {Listings.Name, Listings.Id, Sellers.Id, Sellers.Name} ]
。
我希望将其映射到 DTO,我无法将具有不同节点和标签的结果映射到 DTO/POJO class.
正如您已经注意到的,Spring Data Neo4j 在映射不能直接应用于一个域实体的“任意”数据时更加严格。
但另一方面 Spring Data Neo4j 也提供了对映射松散数据的支持 Neo4jClient
。
示例:
class SoldProductInformation {
String productName;
Set<SellingInformation> sellingInformation;
}
class SellingInformation {
String listingsName;
String listingsId;
String sellerName;
String sellerId
}
neo4jClient.query("...return product.name as productName, someListWithTheInformationFromTheQuestion")
.fetchAs(SoldProductInformation.class)
.mappedBy((TypeSystem t, Record record) -> {
String productName = record.get("productName").asString();
List<SellingInformation> sellingInformations = record.get("someListWithTheInformationFromTheQuestion").asList(value -> {
String listingsName = value.get("listingsName").asString();
// same for listingsId, sellerName, sellerId...
return new SellingInformation(....);
});
return new SoldProductInformation(....);
})
如果你有更多的实体对齐字段 and/or 也许 return 还有节点,你可以使用派生映射函数:
BiFunction<TypeSystem, MapAccessor, Product> mappingFunction = neo4jMappingContext.getRequiredMappingFunctionFor(Product.class);
并通过
应用neo4jClient.query("...return product,...")
.fetchAs(SoldProductInformation.class)
.mappedBy((TypeSystem t, Record record) -> {
Product product = mappingFunction.apply(typeSystem, record.get("product"));
String productName = product.getName();
// ....
有关完整示例,请参阅 https://github.com/spring-projects/spring-data-neo4j/issues/2288#issuecomment-861255508。