我正在尝试使用自定义查询从 Neo4j 检索数据集并使用 DTO 映射数据。问题是我试图从相关的不同节点检索信息,其中一个作为列表,并且该列表不会映射到结果。在 Neo4j Workspace(在网络上)中,可以正确检索信息,但在 Spring Boot 中,它不会映射。
我正在使用此查询来检索信息:
MATCH (person:Person) WHERE toLower(person.fullname) =~ toLower("Fullname")
OPTIONAL MATCH (person)-[:HAS]->(event:Event) WHERE (person)-[:HAS]->(event)
WITH event, person
RETURN person, COLLECT(DISTINCT event{.*}) as events
来自 Neo4j Workspace 的信息是正确的:
但收到的数据显示事件列表尚未映射。
[
{
"id": "00000000",
"name": "Name",
"fullname": "Fullname",
"sex": "Masculino",
"first_surname": "Surname",
"second_surname": "Surname",
"events": []
}
]
结果应该如下:
[
{
"id": "00000000",
"name": "Name",
"fullname": "Fullname",
"sex": "Masculino",
"first_surname": "Surname",
"second_surname": "Surname",
"events": [{
id:"0000000",
type:"type",
place:"Some place",
date:1900-01-01
}]
}
]
我使用的DTO类如下:
PersonDTO.java
@Data
public class PersonDTO {
private String id;
private String name;
private String firstSurname;
private String secondSurname;
private String fullname;
private String sex;
private List<EventDTO> events;
}
EventDTO.java
@Data
public class EventDTO {
private String id;
private LocalDate date;
private String place;
private String type;
}
存储库看起来像这样:
public interface PersonRepository extends Neo4jRepository<Person,String> {
@Query("MATCH (person:Person) WHERE toLower(person.fullname) =~ toLower($fullname)\n"
+ "OPTIONAL MATCH (person)-[:HAS]->(event:Event) WHERE (person)-[:HAS]->(event)\n"
+ "WITH event, person\n"
+ "RETURN person, COLLECT(DISTINCT event{.*}) as events")
List<PersonDTO> findByFullname(@Param("fullname") String fullname);
}
仅此而已...!
谢谢。
如果您确定您的 events 数据已正确检索,您可以尝试 mapstruct。
这将帮助您将自定义字段从实体映射到 DTO。
你只需要定义方法,mapstruct就会根据你提供的方法参数类型和返回类型给出实现。