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 и его обобщенным типом.

Давайте рассмотрим шаг за шагом:

  1. Вы должны определить сущность, например

    @NodeEntity
    public class User {
        @Id @GeneratedValue
        private Long id;
        ...
    
  2. Затем определите репозиторий, расширяющий 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, как указано в вашем комментарии. Пожалуйста, проверьте дважды.

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