Как выполнять запросы на основе отношений "один ко многим" в Spring Data Neo4j

Я определил простое отношение один ко многим как:

@Relationship(type = "BELONG")
private Set<Category> categories;

Я хочу запросить все объекты на основе точного набора Category, т.е. реализовать что-то вроде:

Page<SomeObject> findAllByCategories(Set<Category> categories, PageRequest page);

Каков наилучший способ сделать это в Spring Data Neo4j?

1 ответ

У вас есть несколько вариантов того, как вы можете это сделать.

Ваш телефонный код может просто позвонить по следующему SomeObjectRepository:

Iterable<Long> ids = categories.stream().map(SomeObject::getId).collect(Collectors.toSet());
Iterable<SomeObject> someObjects = someObjectRepository.findAll(ids, 1);

Обратите внимание, что этот метод не поддерживает подкачку.

Другой способ - ввести Session в ваш вызывающий код и либо напишите пользовательский запрос Cypher для получения нужных объектов, либо используйте метод load all по экземпляру:

@Autowired
private Session session;

...

// Option 1: write some cypher
Map<String, Object> params = new HashMap<>():
params.put("ids", ids) // use a stream like above to collect the ids.
Iterable<SomeObject> someObjects = session.query(SomeObject.class, "MATCH (n:SomeObject) ...", params);

//Option 2: use the load by instances method which also allows pagination:
Collection<SomeObject> someObjects = session.loadAll(categories, new Pagination(0, 25));

Моя рекомендация - вариант 2, так как он делает именно то, что вы хотите.

Другие вопросы по тегам