如何将自定义查询的结果映射到 Spring Boot 中的 DTO?

问题描述 投票:0回答:1

我正在尝试使用自定义查询从 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 的信息是正确的:

Example

但收到的数据显示事件列表尚未映射。

[
    {
        "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);

}

仅此而已...!

谢谢。

java spring-boot neo4j cypher
1个回答
0
投票

如果您确定您的 events 数据已正确检索,您可以尝试 mapstruct

这将帮助您将自定义字段从实体映射到 DTO。

你只需要定义方法,mapstruct就会根据你提供的方法参数类型和返回类型给出实现。

© www.soinside.com 2019 - 2024. All rights reserved.