Spring-framework функция Neo4jRepository, findById, вызывает ошибку Cypher
Фон
Мое весеннее приложение data neo4j выдает ошибки шифрования.
Это странно, потому что я использую neo ogm для управления всеми своими cyper-утверждениями, я сам не написал ни одного шифра.
Вот мои ошибки:
Ошибка Cypher в выходе CLI
Error executing Cypher "Neo.ClientError.Statement.SyntaxError"; Code: Neo.ClientError.Statement.SyntaxError; Description: Invalid input '|': expected whitespace, comment, a relationship pattern, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, ',' or ']...
Ошибка OGM в выходе CLI после ошибки шифра
...nested exception is org.neo4j.ogm.exception.CypherException: Error executing Cypher \"Neo.ClientError.Statement.SyntaxError\"; Code: Neo.ClientError.Statement.SyntaxError; Description: Invalid input '|': expected whitespace, comment, a relationship pattern, '...
Ошибка при поиске места в моем коде, где происходит ошибка (GenericService)
...myproject.service.GenericService.find(GenericService.java:39) ~[classes/:na]...
Линия 39 GenericService
Optional<T> object = getRepository().findById(id, depth);
Где я застрял
findById
объявляется в springframework.data.neo4j.repository.Neo4jRepository.java как Optional<T> findById(ID id, int depth);
Недавно я начал использовать neo4jrepository вместо graphrepository, так как я перешел на Spring data neo4j 5.0.0.
Итак, я думаю, что я нашел проблему в коде, но это не мой код, это библиотека, но я не могу поверить, что самый последний neo4j ogm был выпущен с ошибкой в findById
функция.
Вопрос
Как мне пройти эту ошибку Cypher? Откуда может возникнуть эта проблема?
ОБНОВЛЕНИЕ 1
Я использую neo4j-ogm-версию 3.0.0, spring-boot 2.0.0.M3, Neo4J - 3.2.3 и spring-data-neo4j 5.0.0.RELEASE,
ОБНОВЛЕНИЕ 2
Может ли быть так, что мой идентификатор создается как Long
в то время как Neo4jRepository.java имеет экземпляр как ID
?
БОЛЬШЕ КОНТЕКСТА в GenericService.java
public T find(Long id) {
Optional<T> object = getRepository().findById(id, DEPTH_ENTITY);
if(object.isPresent())
return object.get();
return null;
}
ОБНОВЛЕНИЕ 3
springframework.data.neo4j.repository.Neo4jRepository.java содержит
@NoRepositoryBean
public interface Neo4jRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
<S extends T> S save(S s, int depth);
<S extends T> Iterable<S> save(Iterable<S> entities, int depth);
Optional<T> findById(ID id, int depth);
Iterable<T> findAll();
Iterable<T> findAll(int depth);
Iterable<T> findAll(Sort sort);
Iterable<T> findAll(Sort sort, int depth);
Iterable<T> findAllById(Iterable<ID> ids);
Iterable<T> findAllById(Iterable<ID> ids, int depth);
Iterable<T> findAllById(Iterable<ID> ids, Sort sort);
Iterable<T> findAllById(Iterable<ID> ids, Sort sort, int depth);
/**
* Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
* {@link Page#getTotalPages()} returns an estimation of the total number of pages and should not be relied upon for accuracy.
*
* @param pageable
* @return a page of entities
*/
Page<T> findAll(Pageable pageable);
/**
* Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
* {@link Page#getTotalPages()} returns an estimation of the total number of pages and should not be relied upon for accuracy.
*
* @param pageable
* @param depth
* @return a page of entities
*/
Page<T> findAll(Pageable pageable, int depth);
}
1 ответ
Похоже, вы не очень хорошо знакомы с Java и его обобщенным типом.
Давайте рассмотрим шаг за шагом:
Вы должны определить сущность, например
@NodeEntity public class User { @Id @GeneratedValue private Long id; ...
Затем определите репозиторий, расширяющий Neo4jRepository из SDN
public interface UserRepository extends Neo4jRepository<User, Long> { }
Таким образом, вы специализируетесь Neo4jRepository
указав, что вы хотите управлять хранилищем User
чья личность определяется Long
, Метод, определенный в Neo4jRepository
:
Optional<T> findById(ID id, int depth);
Становится этой специализированной версией в вашем хранилище
Optional<User> findById(Long id, int depth);
Вы никогда не используете Neo4jRepository
напрямую, только те подчиненные интерфейсы, которые вы определяете.
Для более подробной информации, пожалуйста, ознакомьтесь со ссылкой на общие данные Spring Data. Также подумайте о том, чтобы взглянуть на общие типы Java.
Обновить
Помимо того, что использование SDN является неправильным, я думаю, что причиной ошибки является то, что вы используете версию Neo4j < 3.1
Я очень сомневаюсь, что вы используете 3.2.3, как указано в вашем комментарии. Пожалуйста, проверьте дважды.