В моем приложении 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)
В SDN3 вы не можете просто создать карту и это прикинуться NodeEntity, это то, что @QueryResult аннотированный DTO для. См. Документы. –
Я хотел бы избежать использования Пользователя в качестве участника голосования и в то же время, что и отдельный объект в @QueryResult (Vote, User) .. Я думаю, что это избыточно. – alexanoid