Геррит прав. Я хотел бы добавить два варианта, которые мы имеем здесь. Мы предоставляем инъецируемую Session
, которая привязана к текущему потоку и интегрирована с транзакциями Springs. Просто подключите автоматическое соединение вместо SessionFactory
, и вы сможете использовать свое решение. Обратите внимание, что я использую инъекцию конструктора, как рекомендуется для всех проектов Spring:
@Repository
@Transactional
class SearchRepositoryImpl implements SearchRepositoryCustom {
private final Session session;
public SearchRepositoryImpl(Session session) {
this.session = session;
}
@Override
public Iterable<ThingEntity> searchByCriteria() {
String query = "MATCH (t:ThingEntity) RETURN t LIMIT 10";
return session.query(ThingEntity.class, query, Map.of());
}
}
Я использовал другой домен для создания краткого примера проекта, но идея осталась прежней.
Для такого простого случая использования я полностью согласен с Gerrit и буду использовать аннотацию @Query
в декларативном репозитории Spring Data Neo4j, например:
interface ThingRepository extends Neo4jRepository<ThingEntity, Long> {
@Query("MATCH (t:ThingEntity) RETURN t LIMIT 10")
public Iterable<ThingEntity> searchByCriteria();
}
Использование такое же, как показано здесь:
@Component
class ExampleUsage implements CommandLineRunner {
private final ThingRepository thingRepository;
private final SearchRepositoryCustom searchRepositoryCustom;
public ExampleUsage(ThingRepository thingRepository, SearchRepositoryCustom searchRepositoryCustom) {
this.thingRepository = thingRepository;
this.searchRepositoryCustom = searchRepositoryCustom;
}
@Override
public void run(String... args) {
this.thingRepository.save(new ThingEntity(1));
this.thingRepository.save(new ThingEntity(2));
var things = this.searchRepositoryCustom.searchByCriteria();
things.forEach(System.out::println);
things = this.thingRepository.searchByCriteria();
things.forEach(System.out::println);
}
}
Вы найдете полное приложение в виде сущности: Используйте инъекционную сессию OGM Spring Data Neo4js . Я использовал Java 10 вместо 8, когда мы приближались к EOL для Java 8, но это не меняет реализации репозитория. Кроме того, протестировано с Spring Boot 2.0.4, Spring Data Kay и OGM 3.1.0.
Редактировать: В отношении комментария: вводимый сеанс является прокси. Само поле является окончательным, но прокси-сервер открывает сеансы по мере необходимости, а затем делегирует его.