1

我有这个查询,用 cypher-dsl 构建(b/​​c MATCH-clause 是动态的),结果集包含由带@NodeEntity注释的 POJO(在其他列中)表示的节点。

我的问题是:有没有办法将动态(非注释)查询的结果包装到@MapResult(或以 NodeEntities 作为值的常规 Map )中?

以下方法似乎不起作用,因为推断的类型GraphRepository必须是节点实体或关系实体:

@NodeEntity
public class Customer {
    @GraphId
    Long id;
    ...
}

@MapResult
public interface CustomerQueryResult {
    @ResultColumn("cust")
    Customer getCustomer();
    @ResultColumn("val1")
    int getVal1();
    ...
}

public interface CustomerQueryRepository extends GraphRepository<CustomerQueryResult> {
}

@Service
public class SearchService {
    private CustomerQueryRepository repo;
    ...

    @Inject
    public SearchService(CustomerQueryRepository repo, ...) {
        this.repo = repo;
        ...
    }

    public Iterable<CustomerQueryResult> search(...) {
        Execute cyQuery =
            start(...)
            ...
            .returns(
                "cust",
                "val1",
                ...
            );
        return this.repo.query(cyQuery.toString(), ...);
    }
}

我正在使用 spring-data-neo4j 版本2.3.0.M1

感谢您的帮助,提前


更新: 好的,使用Neo4jTemplate'squeryconvert方法,完成工作:

@Inject
public SearchService(Neo4jTemplate template, ...) {
    this.template = template;
    ...
}

public List<QueryResult> search(...) {
    List<QueryResult> result = new ArrayList<>();
    Execute cyQuery =
        start(...)
        ...
        .returns(
            "cust",
            "val1",
            ...
        );
    for (Map<String, Object> res : this.template.query(cyQuery.toString(), ...)) {
        Customer cust = this.template.convert((NodeProxy)res.get("cust"), Customer.class);
        result.add(new QueryResult()
            .setCustomer(cust)
            ...
        );
    }
    return result;
}

(假设 Customer 现在是一个类而不是接口了)

但是,是否有更好的方法来做到这一点?

4

1 回答 1

2

您应该可以使用query(...).to(CustomerQueryResult.class).

还有CypherDslRepository一个你可以用来运行你的查询,你会得到一个EndResult你可以使用to(CustomerQueryResult.class)的。

public interface CypherDslRepository<T> {
    Page<T> query(Execute query, Map<String, Object> params, Pageable page);
    Page<T> query(Execute query, Execute countQuery, Map<String, Object> params, Pageable page);
    EndResult<T> query(Execute query, Map<String, Object> params);
}


public interface CustomerQueryRepository extends GraphRepository<Customer>, 
                                                 CypherDslRepository<Customer> {
}
于 2013-09-04T09:37:46.863 回答