2015-04-02 2 views
2

В моем приложении Spring Загрузочный/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.username и Vote.author.id и не получать всю другую информацию от User лица, связанные с Vote лица? Во всяком случае, прямо сейчас у меня есть только Vote.author.id значение.

EDITED:

следующий запрос

@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 для. См. Документы. –

+0

Я хотел бы избежать использования Пользователя в качестве участника голосования и в то же время, что и отдельный объект в @QueryResult (Vote, User) .. Я думаю, что это избыточно. – alexanoid

ответ

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: Решение) <- [: VOTED_FOR] - (v: Голосование) - [: VOTED_ON] -> (c : Criterion) WHERE id (d) = {decisionId} И id (c) = {criterionId} WITH v, d, c MATCH v - [: CREATED_BY] -> (u: Пользователь) RETURN v.id как voteId, d. id as decisionId, c.id as criterionId, v.weight as weight, v.description как описание, u.id as authorId, u.username as authorName, v.createDate as createDate, v.updateDate как updateDate ") \t Список getVotesForDecisionOnCriterion (@Param ("decisionId") Long decisionId, @Param ("criterionId") Long criterionId); – alexanoid

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

Спасибо, но он вернет два выделенных объекта - Vote и String. Но я ищу решение, как заполнить v.author.username с u.username из вашего запроса и вернуть только «v» – alexanoid

+0

i обновил ответ и объединил свойства в одну карту ... - не v, хотя –

+0

Хорошая идея! Но я не могу заставить его работать со следующим исключением: org.springframework.dao.InvalidDataAccessApiUsageException: [Assertion failed] - требуется сущность; он не должен быть пустым \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

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