我有这个查询,用 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
'squery
和convert
方法,完成工作:
@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 现在是一个类而不是接口了)
但是,是否有更好的方法来做到这一点?