2016-08-26 3 views
4

У меня возникла проблема с запросом на основе свойства Enum моего NodeEntity.Невозможно использовать перечисление в запросе репозитория (neo4j/Spring Data)

NodeEntity в вопросе определяется:

@NodeEntity(label = "Entity") 
public class MyEntity { 

    @GraphId 
    private Long internalId; 

    .... 

    private State state; 

    @Transient 
    public enum State { 
     STATEONE, STATETWO, STATETHREE 
    } 
    .... 

Это экономит без проблем, состояние Enum представляется совершенно, и я могу запросить, используя свойства (строки) без проблем вообще. Однако проблема заключается в следующем запросе в репозитории:

@Query("MATCH (entity:Entity {state:{0}})" + 
     "RETURN entity") 
List<MyEntity> findByState(MyEntity.State state) 

т. Е. Найти все объекты с данным состоянием.

Не исключение, однако использование этого просто возвращает список из 0 сущностей.

Я пробовал всевозможные варианты этого, используя предложение WHERE, например, без везения.

Объекты сохраняются должным образом, используя findAll() в том же тесте, возвращает ожидаемый список объектов с их состояниями точно так, как я ожидал бы.

Любые мысли?

+1

Привет @ R.B! Вы уверены, что состояние атрибута правильно сохранено в базе данных neo4j? Я попытался воспроизвести ваш прецедент и объявить enum @Transient, состояние атрибута не сохраняется. Снятие состояния переходной аннотации выполняется правильно, и запрос также работает нормально. Не могли бы вы попробовать? – troig

+1

Это определенно сохранялось. Для меня объекты могут быть сохранены без проблем, а свойство «state» может быть даже изменено с использованием метода транзакции. Однако переходный процесс по определению enum действительно вызывал проблемы. Спасибо, без него я могу запросить, никаких проблем. –

ответ

5

Не совсем уверен, что значение @Transient добавляет к перечислению. В любом случае это не является устойчивым как узел или отношение в Neo4j. Достаточно определить поле как тот, который должен сохраняться с

private State state;

и оставить от @Transient в аннотацию из перечисления. С его помощью SDN игнорирует поле, отправленное на производный запрос.

Однако, если у вас есть веская причина отметить перечисление @Transient, пожалуйста, поделитесь им, и мы снова посетим этот случай.

+0

Спасибо, это ответ. Проблемы были вызваны переходными процессами. Он был добавлен в качестве меры предосторожности, чтобы гарантировать, что SDN не попытался что-либо сделать с перечислением. Однако имеет смысл, что он ведет себя таким образом без @Transient. Спасибо за ваше внимание. –

Смежные вопросы