Хорошо, у меня есть объект под названием «Расписание», и у него есть атрибут, который представляет собой список объектов-добровольцев, называемых «добровольцами». Субъект добровольца имеет аннотацию @RelationshipEntity. Я пытался получить список сущностей Schedule через репозиторий, расширяющий класс Neo4jRepository, но при получении списка расписаний атрибут волонтеров всегда пуст, хотя при тестировании запроса вручную с помощью браузера Neo4j ожидаемый набор результатов там.
Первоначально отношения были намного проще: сущность Schedule имела свойство набора сущностей User, называемых добровольцами, а написанный мной репозиторий-запрос легко извлекал расписания и сопоставлял извлеченные пользователи с атрибутом волонтеров. Но когда я изменил отношение к POJO, аннотированному с помощью @RelationshipEntity, запрос не сопоставляет извлеченные записи отношений с атрибутом волонтеров.
Я знаю, что запросы шифров верны, потому что я проверил их в браузере Neo4j, и он правильно извлекает нужный мне набор результатов.
Я также пытался создать метод Repository, который будет извлекать только объекты добровольцев, но он также просто возвращает пустые коллекции.
В настоящее время я использую следующие связанные библиотеки:
- весенне-загрузочная версия 2.0.3.RELEASE
- spring-boot-starter-data-neo4j 2.0.3.RELEASE
- neo4j-ogm-core 3.1.0
- neo4j-ogm-api 3.1.0
Это объект расписания POJO:
@Data
@EqualsAndHashCode(callSuper = false, exclude = "volunteers")
@NodeEntity
public class Schedule {
@Id
@GeneratedValue(strategy = UuidStrategy.class)
private String uuid;
private String description;
private Date startTime;
private Date endTime;
@Relationship(type = "VOLUNTEERED", direction = Relationship.INCOMING)
private Set<Volunteer> volunteers = new HashSet<>();
public void addVolunteer(Volunteer volunteer){
if (volunteer != null && this.volunteers != null){
this.volunteers.add(volunteer);
}
}
}
Это POJO, хранящий детали отношений:
@Data
@EqualsAndHashCode(callSuper = false, exclude = "schedule")
@RelationshipEntity(type = "VOLUNTEERED")
public class Volunteer {
public Volunteer(Schedule schedule, User user){
this.schedule = schedule;
this.user = user;
this.signUpDate = new Date();
}
@Id
@GeneratedValue(strategy = UuidStrategy.class)
private String uuid;
@StartNode
private Schedule schedule;
@EndNode
private User user;
private Date signUpDate;
}
Это код репозитория, который возвращает список расписаний, которые мне нужны:
@Query("MATCH(s:Schedule)<-[v:VOLUNTEERED]-(u:User) " +
"WHERE u.uuid = {userUuid} return s, v, u")
List<Schedule> findSchedulesByVolunteer(@Param("userUuid") String userUuid);
Это код репозитория, который предполагает получение списка нужных мне объектов добровольцев:
@Query("MATCH(s:Schedule)<-[v:VOLUNTEERED]-(u:User) " +
"WHERE s.uuid = {schedUuid} return v")
Set<Volunteer> findVolunteersBySchedule(@Param("schedUuid") String schedUuid);