Я делаю простой поиск Camel Case на узле в Neo4J 4.0.0.M1:
e.g.
UserRepository.findByUserId(String userId);
Я вижу в своем файле журнала, что генерируется правильный запрос Cypher:
match (u:User) where u.userId = {0} return u
и я могу запустить этот код в браузере Neo4J с ожидаемым результатом возврата одного узла. Я также вижу, что генерируется правильный JSON
e.g.
21:53:39.819 [tomcat-http--37] INFO o.n.o.session.request.DefaultRequest - POST http://localhost:7474/db/data/transaction/commit, request: {"statements":[{"statement":"match (u:User) where u.userId = {0} return u","parameters":{"0":"145"},"resultDataContents":["graph"]}]}
и я могу запустить это из PostMaster и получить ожидаемый результат возврата одного узла.
Однако выполнение этого через код с именованным запросом в GraphRepository
возвращает каждый узел, который в настоящее время, как я полагаю, находится в Neo4JSession
.
Вот пользовательский репозиторий:
@Repository
public interface UserNodeRepository extends GraphRepository<User> {
@Query ("match (u:User) where u.userId = {0} return u")
public List<User> findByUserId(String userId);
}
Запуск этого кода возвращает всех пользователей, которых я когда-либо создавал в Neo4J.
Обратите внимание, что я изменил возвращаемый тип на список, потому что ожидаемое поведение одного возвращаемого узла не происходило, и я получал исключение сопоставления. Также обратите внимание, что здесь есть именованный запрос, потому что я не был уверен, что проблема может быть связана с поиском Camel Case по сравнению с именованным запросом.
Это также работало правильно в Neo4J 3.3.x.
Кроме того, я проследил проблему до Neo4JSession.query()
, где выполняется вызов Neo4JSession.query, который, в свою очередь, делает следующее:
return getResponseHandler().loadAll(type, response);
Это возвращает все узлы в MappingContext с заданным типом класса. Я считаю, что он должен вызывать Neo4JSession.loadByProperty
, который выполняет поиск на узле.
Есть ли настройка, которую мне не хватает?