Как выполнять запросы на основе отношений "один ко многим" в 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, так как он делает именно то, что вы хотите.