Функция Spring-frame Neo4jRepository, findById, вызывает ошибку шифрования

Фон

Мое приложение весенних данных neo4j выдает ошибки шифрования.

Это странно, потому что я использую neo ogm для управления всеми своими операторами cyper, я сам не писал никаких шифров.

Вот мои ошибки:

Ошибка шифрования в выводе 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 neo4j 5.0.0.

Итак, я думаю, что нашел проблему в коде, но это не мой код, это библиотека, но я не могу поверить, что самый последний OGM neo4j был выпущен с ошибкой в ​​​​функции findById.

Вопрос

Как мне обойти эту ошибку шифра? Откуда может исходить эта проблема?

ОБНОВЛЕНИЕ 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);
}

person Rorschach    schedule 09.10.2017    source источник
comment
Какая у вас версия Neo4j?   -  person nmervaillie    schedule 09.10.2017
comment
Neo4j — это версия 3.2.3 @nmervaillie   -  person Rorschach    schedule 09.10.2017
comment
Можете ли вы опубликовать код вашего репозитория и вашей сущности?   -  person nmervaillie    schedule 09.10.2017
comment
@nmervaillie springframework.data.neo4j.repository.Neo4jRepository.java — это мой репозиторий, а DEPTH_ENTITY — это просто public static final int DEPTH_ENTITY = 1;. Я добавил код файла репо в ОБНОВЛЕНИИ 3.   -  person Rorschach    schedule 09.10.2017


Ответы (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. общая ссылка. Также подумайте о том, чтобы взглянуть на общие типы Java.

Обновить

Помимо того, что использование SDN некорректно, я думаю, что причина ошибки в том, что вы используете версию Neo4j ‹ 3.1.

Я очень сомневаюсь, что вы используете 3.2.3, как указано в вашем комментарии. Пожалуйста, проверьте дважды.

person nmervaillie    schedule 09.10.2017
comment
увидев ваше обновление, я перепроверил свой neo4j и увидел, что у меня есть neo4j 3.0.11, работающий на локальном хосте, и 3.2.3. работает на 127.0.0.1 одновременно (я даже не знал, что это возможно). Это, наверное, сердцевина моей проблемы. Я приму ваш ответ, если у меня заработает код после удаления старого файла neo4j. - person Rorschach; 11.10.2017