2017-10-18 1 views
0

에 대한 표현처럼 나는 POJO 아래와 같이 중첩했습니다SQL 중첩 obejct

class Parent{ 
String name; 
Child child; 
} 
class Child{ 
String name; 
} 

가 어떤 이름으로 아이를 일치하도록 SQL과 유사한 쿼리 것입니까?

지금까지 나는이있다 : 나를 Failed to parse query at line 1:21: mismatched input '.' expecting ','

답변

0

CQEngine와 중첩 된 객체에서 필드를 조회하려면 줄

CQNParser<Parent> parser = CQNParser.forPojoWithAttributes(Parent.class, AttributeBytecodeGenerator.createAttributes(Parent.class)); 
ParseResult<Notification> parseResult = parser.parse("equal(\"child\".\"name\" , \"John\")"); 
Prent p = new Parent().setChild(new Child().setName("John")); 
boolean matches = parseResult.getQuery().matches(p, parseResult.getQueryOptions()); 

, 당신은 일반적으로 내부의 중첩 된 값을 읽을 수있는 논리를 넣어하셔야합니다 특성이 아니라 쿼리 내에 있습니다. 이렇게하면 속성에서 중첩 필드를 일반/비 중첩 필드처럼 쿼리에 노출합니다.

this related question의 중첩 필드를 읽으려면 수동으로 속성을 쓰는 방법의 예가 있습니다. 당신이 다음이 중첩 된 객체의 필드의 속성을 생성하도록 설계되지 않는다는 인식에 AttributeBytecodeGenerator 속성을 자동으로 생성 사용하는 경우

생성이 자동으로

속성. POJO에서만 필드에 대한 속성을 생성합니다 (Plain Old Java Objects).

개체에 중첩 된 개체가 포함되어 있으면 기술적으로 실제로는 POJO가 아니며 개체 그래프와 유사합니다.

그래프에 일대 다 또는 다 대다 관계가 포함될 수 있으므로 실제로 고정 될 가능성이있는 AttributeBytecodeGenerator의 제한 사항이 아닙니다. 중첩 된 객체에서 의미있는 값을 추출하기 위해 그래프를 탐색하는 방법을 결정하는 것은 일반적으로 사람이 수행합니다.

위의 링크 된 질문에서 손으로 쓴 특성을 살펴보면 해당 특성에 대해 중첩 된 값을 가져 오는 데 꽤 복잡한 그래프 탐색 알고리즘을 실제로 구현한다고 생각해보십시오. 따라서 AttributeBytecodeGenerator은이 작업을 시도하지 않습니다. 우리는 (또는 오히려 CQEngine가) 대신 쿼리에 중첩 된 값으로 경로를 지정할 수없는 이유 쿼리에 중첩 된 값으로

지정 경로는

당신은 궁금 할 것이다. 이는 성과와 관련이 있습니다.

CQEngine은 개체 그래프를 통해 중첩 된 값으로 경로를 지정해야합니다. 이는 중첩 된 값에 대해 인덱스를 작성할 수있는 유일한 방법이기 때문에 특성 내부에 정적으로 (프로그래밍 방식으로) 지정해야합니다.

이 경우가 아니고 중첩 된 값의 경로가 쿼리에서만 제공된 경우에는 중첩 된 값을 기준으로 인덱스를 미리 작성할 수 없습니다. 따라서 쿼리에 응답하는 유일한 방법은 전체 컬렉션을 통해 무차별 대검 스캔을하는 것입니다.

중첩 된 값을 색인 할 수 있으므로 속성에서 중첩 된 값을 읽는 방법을 지정하는 것이 성능면에서 유리합니다.

요약

는 TL; DR은 : 당신이 절대적으로 CQEngine 복잡한 객체를 사용해야하는 경우, 당신은 아마 손으로 중첩 된 알엇을 읽고 특성을 작성해야합니다 두려워! 다른 대안은 객체 그래프를 실제 POJO로 리팩터링하거나 평평하게 만드는 것입니다. 희망이 도움이됩니다!

+0

'AttributeBytecodeGenerator.createAttributes (Parent.class)'가'name' 및'child' 키가있는 맵을 반환한다는 것을 이해합니다. @npgall ...'name','' child'와'child.name'이 있습니다. –

+0

좋은 지적입니다. 이 메소드가'AttributeBytecodeGenerator'와 어떻게 관련되어 있는지에 대한 더 많은 정보를 제공하도록 답변을 업데이트했습니다. – npgall