1

cypher-dsl (b/c -clause は動的) で構築されたこのクエリがあり、結果セットには、注釈付きの POJO (他の列の中でも)MATCHによって表されるノードが含まれます。@NodeEntity

私の質問は次のとおりです: 動的 (注釈なし) クエリの結果を@MapResult(または値として NodeEntities を持つ通常のマップ) にラップする方法はありますか?

GraphRepositoryの推論された型はNode- または RelationshipEntityでなければならないため、次のアプローチは機能しないようです。

@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

事前にご協力いただきありがとうございます


更新: わかりました、とメソッドを使用して、仕事をしますNeo4jTemplatequeryconvert

@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