2016-08-26 9 views
4

NodeEntityのEnumプロパティに基づいて問合せに問題があります。問題のリポジトリクエリでenumを使用できません(neo4j/Springデータ)

NodeEntityが定義されている:

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

    @GraphId 
    private Long internalId; 

    .... 

    private State state; 

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

それは問題なく保存し、状態列挙型は完全に代表される、と私は全く問題なく、他のプロパティ(文字列)を使用して照会することができます。しかし、問題は、リポジトリ内の次のクエリです。

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

つまり、指定された状態のすべてのエンティティを見つけます。

これは例外ではありませんが、これを使用すると、List of 0 Entitiesが返されます。

これは、たとえばWHERE句を使用していますが、これはすべての種類の変更を試みました。

エンティティは適切に保持されます。同じテストでfindAll()を使用すると、期待どおりの状態のエンティティが返されます。

どのような考えですか?

+1

こんにちはR.B!属性状態がneo4jデータベースに正しく保存されていますか?あなたのユースケースを再現しようとしましたが、enum @Transientを宣言すると、属性の状態は保持されません。一時的な注釈ステータスの削除は正しく行われており、クエリは正常に機能しています。それを試してみることができますか? – troig

+1

これは間違いなく永続化されました。私の場合、エンティティは問題なく保存でき、「状態」プロパティはTransactionメソッドを使用して変更することさえできます。しかし、列挙型定義のTransientが実際に問題を引き起こしていました。ありがとう、それなしでは、私は照会することができます、問題はありません。 –

答えて

5

@Transientが列挙型に何を追加するかは不明です。とにかく、Neo4jのノードまたは関係として永続性がありません。

private State state;

で持続し、列挙から@Transient注釈をオフに残すべきものとしてフィールドを定義するのに十分です。 これで、SDNは派生クエリに送信されたフィールドを無視します。

ただし、enum @Transientに印を付けるのに十分な理由がある場合は、それを共有してください。このケースを再訪します。

+0

ありがとう、これは答えです。トランジェントは問題を引き起こしていました。これは、SDNが列挙型で何もしないようにするための予防措置として追加されました。しかし、それは@Transientなしでこのように動作することが理にかなっています。あなたの指導に感謝します。 –