2

GAE 데이터 저장소를 쿼리 할 때 이상한 동작이 발생합니다. 특정 상황에서 정수 필드에 대해 필터가 작동하지 않습니다.정수 필드 쿼리 GAE 데이터 저장소

log.info("start experiment"); 

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

int val = 777; 

// create and store the first entity. 
Entity testEntity1 = new Entity(KeyFactory.createKey("Test", "entity1")); 
Object value = new Integer(val); 
testEntity1.setProperty("field", value); 
datastore.put(testEntity1); 

// create the second entity by using BeanUtils. 
Test test2 = new Test(); // just a regular bean with an int field 
test2.setField(val); 

Entity testEntity2 = new Entity(KeyFactory.createKey("Test", "entity2")); 

Map<String, Object> description = BeanUtilsBean.getInstance().describe(test2); 
for(Entry<String,Object> entry:description.entrySet()){ 
    testEntity2.setProperty(entry.getKey(), entry.getValue()); 
} 

datastore.put(testEntity2); 


// now try to retrieve the entities from the database... 

Filter equalFilter = new FilterPredicate("field", FilterOperator.EQUAL, val); 

Query q = new Query("Test").setFilter(equalFilter); 

Iterator<Entity> iter = datastore.prepare(q).asIterator(); 

while (iter.hasNext()) { 
    log.info("found entity: " + iter.next().getKey()); 
} 

log.info("experiment finished"); 

로그는 다음과 같습니다 : 다음 자바 코드는 문제를 재현

에만 두 엔터티가 실제로 데이터 저장소 모두 '에 저장되어있는 경우에도 제 1 개체를 발견 어떤 이유로
INFO: start experiment 
INFO: found entity: Test("entity1") 
INFO: experiment finished 

필드 '값은 777입니다 (데이터 저장소 뷰어에 표시됨). 엔티티가 생성되는 방식이 중요한 이유는 무엇입니까? 편리하기 때문에 BeanUtils를 사용하고 싶습니다.

로컬 서버와 GAE에 동일한 문제점이 발생합니다.

+0

좀 더 자세한 정보를 얻을 수 있습니까? 특히 코드/다이어그램. – Colton

+0

아무도 아이디어가 없습니까? 그래서 JDO를 시도해 볼 수 있습니다. 아주 단순한 코딩조차도 실패 할 때 이러한 정교한 프레임 워크를 사용하여 자신감을 갖게하지는 못합니다. – jjoller

답변

2

그래 무슨 일이 일어나는지 알았어. "문제"는 BeanUtils가 정수를 문자열로 변환하기 때문입니다. 문자열은 데이터 저장소 뷰어에서 똑같이 보이지만 물론 동일하지는 않습니다. 이것은 나를 아주 바보로 만들었습니다. 나는 아파치 BeanUtils 설명서 또는 무언가를 공부 했어야했다.

0

데이터를 쿼리하기 전에 데이터 저장소를 작성한 후 1 초가 경과 했습니까? 때로는 (조상의 질문 일 수도 있고 어쩌면) 다른 일을 할 필요도 없습니다. GAE/J 문서는 자세한 내용을 제공합니다.

+0

그래, 그랬어. 이 실험을 여러 번 반복 할 수 있습니다. 항상 동일합니다. 실제로 나는 수백 개의 엔트리가있는 테이블을 가지고 있는데, 나는 정수 필드를 쿼리 할 수 ​​없다. 아파치 BeanUtils를 사용하여 그것들을 모두 만들었 기 때문일 것이다. – jjoller

0

엔티티가 BeanUtils로 생성된다는 사실은 완전히 관련이 없습니다. 엔터티가 데이터 저장소에 있고 (뷰어에서 볼 수 있음) 필드 값이 인덱싱되면 (데이터 저장소 뷰어의 값 옆에 "인덱스되지 않음"이 표시되지 않음) 필터를 사용하여 엔터티를 쿼리 할 수 ​​있습니다. 이 기능은 데이터 저장소의 기본 기능입니다.

엔티티가 생성되고 색인이 생성되면 Ian Marshalls 제안이 맞을 것입니다. 이를 테스트하려면 App Engine에 대한 환경 설정으로 이동하고 "로컬 HRD 지원 사용"의 선택을 취소하십시오. 이렇게하면 엔터티를 작성할 때 즉시 쿼리 할 수 ​​있습니다.

Integer 또는 int 또는 다른 숫자 값을 저장하는 경우 중요하지 않습니다. 내부적으로 모두 긴 값으로 저장되며 값을 다시 읽으면 정수가 저장 됨에도 불구하고 Long이 반환됩니다.

+0

나는 이것이 완전히 무의미하기를 바랐다. "로컬 HRD 지원 사용"선택을 취소 했는데도 여전히 동일합니다. – jjoller

+0

데이터 저장소 뷰어에서 두 항목을 모두 볼 수 있으며 '필드'값은 모두 777입니다 (내 평판이 충분하지 않아 캡쳐 화면을 게시 할 수 없습니다). "인덱스되지 않음"이 없습니다. 쿼리 인덱스 또는 이와 관련이 있습니까? – jjoller