2015-04-02 41 views
2

在我的春節,啓動/ Neo4j的應用程序,我有以下實體:Neo4j的一個一對多取數據

@NodeEntity 
public class User extends BaseEntity { 

    private static final String HAS = "HAS"; 

    @GraphId 
    private Long id; 

    private String username; 

    private String password; 

    private String email; 

    private String firstName; 

    private String lastName; 

    @RelatedTo(type = HAS, direction = Direction.OUTGOING) 
    private Set<Role> roles = new HashSet<Role>(); 

.... 

} 


@NodeEntity 
public class Vote extends BaseEntity { 

    private static final String VOTED_ON = "VOTED_ON"; 
    private final static String VOTED_FOR = "VOTED_FOR"; 
    private static final String CREATED_BY = "CREATED_BY"; 

    @GraphId 
    private Long id; 

    @RelatedTo(type = VOTED_FOR, direction = Direction.OUTGOING) 
    private Decision decision; 

    @RelatedTo(type = VOTED_ON, direction = Direction.OUTGOING) 
    private Criterion criteria; 

    @RelatedTo(type = CREATED_BY, direction = Direction.OUTGOING) 
    private User author; 

    private double weight; 

    private String description; 


} 

,我有以下SDN庫方法:

@Query("MATCH (d:Decision)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_ON]->(c:Criterion) WHERE id(d) = {decisionId} AND id(c) = {criterionId} RETURN v") 
List<Vote> getVotes(@Param("decisionId") Long decisionId, @Param("criterionId") Long criterionId); 

在結果我有一個Vote的清單。

在客戶端上,我想顯示這些選票的列表,不僅包括用戶(作者)Id,還包括作者username

如何獲取基於上述Vote.author.usernameVote.author.id查詢,並沒有獲取從User實體Vote實體相關聯的所有其他信息?無論如何,現在我只有Vote.author.id價值。

編輯:

以下查詢

@Query("MATCH (d:Decision)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_ON]->(c:Criterion) WHERE id(d) = {decisionId} AND id(c) = {criterionId} WITH v, d, c MATCH v-[:CREATED_BY]->(u:User) RETURN {id: v.id, weight: v.weight, description: v.description, `decision.id` : d.id, `criterion.id` : c.id, `author.id`: u.id, `author.username`: u.username} as v") 
List<Vote> getVotesForDecisionOnCriterion(@Param("decisionId") Long decisionId, @Param("criterionId") Long criterionId); 

不與下面的異常工作:

org.springframework.dao.InvalidDataAccessApiUsageException: [Assertion failed] - entity is required; it must not be null 
    at org.springframework.data.neo4j.support.ParameterCheck.notNull(ParameterCheck.java:29) 
    at org.springframework.data.neo4j.support.Neo4jTemplate.projectTo(Neo4jTemplate.java:240) 
    at org.springframework.data.neo4j.support.conversion.EntityResultConverter.doConvert(EntityResultConverter.java:73) 
    at org.springframework.data.neo4j.conversion.DefaultConverter.convert(DefaultConverter.java:44) 
    at org.springframework.data.neo4j.support.conversion.EntityResultConverter.convert(EntityResultConverter.java:165) 
    at org.springframework.data.neo4j.conversion.QueryResultBuilder$1.underlyingObjectToObject(QueryResultBuilder.java:86) 
+0

在SDN3你不能只是創建地圖,並將它僞裝成一個NodeEntity,這就是@QueryResult註釋DTO是爲了。看文檔。 – 2015-04-02 18:41:24

+0

我想避免讓用戶作爲投票的成員,同時作爲@QueryResult(投票,用戶)中的獨立實體..我認爲這是多餘的。 – alexanoid 2015-04-02 18:48:50

回答

1

與DTO試試這個(也可以用干將接口):

@QueryResult 
class VoteView { 
    String id; 
    Double weight; 
    String description; 
    String decisionId; 
    String criterionId; 
    String authorId; 
    String authorName; 
} 

@Query("MATCH (d:Decision)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_ON]->(c:Criterion) WHERE id(d) = {decisionId} AND id(c) = {criterionId} WITH v, d, c MATCH v-[:CREATED_BY]->(u:User) RETURN {id: v.id, weight: v.weight, description: v.description, decisionId : d.id, criterionId : c.id, authorId: u.id, authorName: u.username} as v") 
List<VoteView> getVotesForDecisionOnCriterion(@Param("decisionId") Long decisionId, @Param("criterionId") Long criterionId); 
+0

謝謝,工作正常,但有以下查詢(返回分隔列,不是地圖)\t @Query(「MATCH(d:Decision)< - [:VOTED_FOR] - (v:Vote) - [:VOTED_ON] - >(c :標準)WHERE id(d)= {decisionId}和id(c)= {criterionId} WITH v,d,c MATCH v - [:CREATED_BY] - >(u:User)RETURN v.id作爲voteId,d。 id爲decisionId,c.id爲criterionId,v.weight爲權重,v.description爲描述,u.id爲authorId,u.username爲authorName,v.createDate爲createDate,v.updateDate爲updateDate「) \t List getVotesForDecisionOnCriterion(@Param(「decisionId」)long decisionId,@Param(「criterionId」)Long criterionId); – alexanoid 2015-04-02 19:33:14

0

我不能與彈簧幫助,但不這樣做暗號得到你想要什麼?

MATCH (d:Decision)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_ON]->(c:Criterion) 
WHERE id(d) = {decisionId} 
    AND id(c) = {criterionId} 
WITH v 
MATCH v-[:CREATED_BY]->(u:User) 
RETURN {id: v.id 
     , weight: v.weight 
     , `author.id`: u.id 
     , `author.username`: u.username 
     ... } as v 
+0

謝謝,但它會返回兩個分離的實體 - 投票和字符串。但我正在尋找一個解決方案,如何填充v.author.username與u.username從您的查詢,並返回只有「v」 – alexanoid 2015-04-02 14:06:03

+0

我更新了答案,並將屬性組合到一個單一的地圖...... - 而不是v – 2015-04-02 14:11:26

+0

不錯的主意!但是我不能使用下面的異常:org.springframework.dao.InvalidDataAccessApiUsageException:[斷言失敗] - 實體是必需的;它不能爲null \t在org.springframework.data.neo4j.support.ParameterCheck.notNull(ParameterCheck.java:29) \t在org.springframework.data.neo4j.support.Neo4jTemplate.projectTo(Neo4jTemplate.java:240 ) \t at org.springframework.data.neo4j.support.conversion.EntityResultConverter.doConvert(EntityResultConverter.java:73) – alexanoid 2015-04-02 14:24:28

相關問題