2016-12-29 6 views
1

에 대한 쿼리를 리포지토리에 수집 매개 변수를 전달하는 방법 : 해당 쿼리가 성공적으로 실행 및 제공내가 저장소 쿼리에 매개 변수로 컬렉션을 전달하려는 Neo4J을 위해 봄 데이터 사용 Neo4J

@Query("MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product") 
Iterable<Product> findAllWithCategories(@Param("categories") List<String> categories); 

명령 행에서 올바른 결과 :

MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN ["Märklin","Fleischmann"]) RETURN product 

그러나 findAllWithCategories 방법이 카테고리의 목록이 호출 될 때 어떤 결과가 반환되지 않습니다 자바 내에서

. 이상한 점은 올바른 http 요청이 DB로 전송 된 것 같습니다.

request: {"statements":[{"statement":"MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product","parameters":{"categories":["Märklin","Fleischmann"]},"resultDataContents":["graph"],"includeStats":false}]} 

무엇이 잘못 되었습니까? 일반적으로 Neo4J에 저장소 쿼리에 대한 매개 변수로 컬렉션을 전달할 수 있습니까?

편집 봄 데이터 저장소하지 않고 있지만, 명령 줄에 쿼리가 무엇을해야처럼 정말 이상하다 Neo4JTemplate이 같은 결과를 얻을 수 더 낮은 수준과 같은 쿼리를 실행.

private final String FIND_PRODUCTS_WITH_CATEGORIES = "MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product"; 

String[] categories = ... 

Map<String, Object> map = new HashedMap<>(); 
map.put("categories", categories); 
products = neo4j.queryForObjects(Product.class, FIND_PRODUCTS_WITH_CATEGORIES, map); 

내가 쿼리 문을 아무 잘못이 있다고 생각하지만, 오히려 목록 유형의 매개 변수를 사용하지 않습니다.

편집 반나절 후 내가 대신 HTTP 드라이버, 볼트 드라이버를 시도하고, 모든 것이 괜찮다고

(드라이버의 버전 2.0.6을 사용하여 버전 2.1.0은 이상한 예외를 throw)
+0

[이 질문] (https://stackoverflow.com/questions/41014573/sdn4-cannot-findbyid-with-list-of-id) 도움이 되셨습니까? – troig

+0

"자동"저장소 찾기가 작동하지 않는 이유는 무엇입니까? 내 경우에는 사용자 정의 쿼리입니다. – Gregor

+0

github 문제 [here] (https://github.com/neo4j/neo4j-ogm/issues)에서'2.1.0' 볼트 드라이버로받은 오류를 보내 주시겠습니까? – digx1

답변

0

검색어가 괜찮습니다. 쿼리에 대한 매개 변수로 배열이나 목록을 가져 오는 것이 효과적입니다. 문제는 드라이버입니다. http 드라이버를 사용하면 성공하지 못합니다. 볼트 드라이버는 최신 버전 2.1.0에서 버그가있는 것 같습니다. 그러나 bolt 2.0.6을 사용하여 실행했습니다.