Próbuję utworzyć niestandardowy @QueryResult z wieloma pól z różnych węzłów, ale wydaje się, że mechanizm wyniku zapytań nie jest w stanie poprawnie mapować mapować enum.

Jest to przykład, który wykonałem do tego scenariusza. Stworzyłem podstawową enum jako:

public enum MyEnum{
    SOMETHING, SOMETHING_ELSE
}

I Spring Data Metoda repozytorium Neo4J z zapytaniem:

    @Query("Match (people:People)-[:LIVES_IN]->(country:Country) " +
            "RETURN people.enum")
    List<WithEnumQueryResult> findPeople();

Kiedy wyczerpuję, rzuca wyjątek:

org.springframework.data.mapping.model.MappingInstantiationException: Failed to instantiate pl.degath.WithEnumQueryResult using constructor pl.degath.WithEnumQueryResult(pl.degath.MyEnum) with arguments SOMETHING_ELSE

Byłem w stanie zobaczyć proces próbny i błąd:

@Builder
@Getter
@QueryResult
public class WithEnumQueryResult{
    private final MyEnum enum; //this one I would like to have, but throws error
    private final String enum; //this returns my enum as String (doesn't throw error)
    private final People people; //this one has correct enum as a property of people (doesn't throw error)
}

Próbowałem również dodać trochę @convertera @Convert(EnumStringConverter.class) adnotacja przed moją własnością enum, ale nie pomogła.

Jakieś pomysły, jak mogę sprawić, by moje Queryresult rozpoznało ateums?

EDYCJA:

Jak wspomniano w komentarzu z zaakceptowanej odpowiedzi, wydaje się, że Enums wymagają konstruktorów No-Args, więc musiałem zmienić mój niezmienny przedmiot w:

@Builder
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
@QueryResult
public class WithEnumQueryResult{
    private MyEnum enum; //enum is visible now!
}
0
degath 20 październik 2020, 15:17

1 odpowiedź

Najlepsza odpowiedź

Poniżej znajdują się klasy i repozytorium moich podmiotów, które doskonale działa dobrze.

@Data
@QueryResult
public class PersonResponse {
    private Long id;
    private String name;
    private int age;
    private City livesAt;
    private Test test;
    private List<Person> friends;
}
public enum Test {
    A, B
}

Metoda repozytorium

 @Query("MATCH (pr:Person) where ID(pr)=$id return ID(pr) as id, pr.test as test, pr.name as name, pr.age as age")
    public PersonResponse getPerson(Long id);

Wynik:

{
  "id": 68,
  "name": "Alex",
  "age": 24,
  "test": "A",
  
}
1
Lucia 22 październik 2020, 07:51