문제

이것 질문 나는 user (com.google.appengine.api.users.user)가 물건을 검색하기 위해 Google DataStore를 쿼리하는 문제를 해결했습니다.

User user = userService.getCurrentUser();
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == paramAuthor"); 
query.declareParameters("java.lang.String paramAuthor"); 
greetings = (List<Greeting>) query.execute(user);

위의 내용은 잘 작동합니다. 그러나 약간의 엉망이 된 후에는이 구문이 더 복잡한 쿼리를 구축해야 할 필요성이 매우 실용적이지 않다는 것을 깨달았습니다. 그래서 필터를 수동으로 빌드하기로 결정했고 이제 다음과 같은 것과 같은 것을 얻었습니다 (예 : 여기서 어디에 있는지. 필터는 일반적으로 문자열 변수로 전달되지만 이제는 단순성을 위해 인라인으로 내장되어 있습니다.

User user = userService.getCurrentUser();    
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == '"+ user.getEmail() +"'");  
greetings = (List<Greeting>) query.execute();

분명히이 구문이 있더라도 이것은 작동하지 않습니다 field = 'value' ~이다 JDOQL에 의해 지원됩니다 그리고 다른 필드 (문자열 유형 및 열거)에서 잘 작동합니다. 또 다른 이상한 점은 앱-엔진 대시 보드에서 데이터 뷰어를보고 '저자'필드가 유형으로 저장된다는 것입니다. 사용자 그러나 값은 'user@gmail.com'이며, 다시 매개 변수로 설정하면 (위의 사례가 잘 작동하는 경우) 매개 변수를 문자열로 선언 한 다음 사용자의 인스턴스 (사용자)를 전달합니다. 간단한 상태로 직렬화됩니다 toString() (나는 추측).

누구든지 아이디어가 있습니까?

도움이 되었습니까?

해결책

쿼리 언어로 문자열 대체를 사용하는 것은 다음과 같습니다 언제나 나쁜 생각. 사용자가 환경을 무너 뜨리고 엉망으로 만드는 것은 너무 쉽고 인코딩 문제 등의 전체 모음을 소개합니다.

이전 매개 변수 대체 접근법에 어떤 문제가 있었습니까? 내가 아는 한, 그것은 모든 것을 지원하고 모든 구문 분석 문제를 회피합니다. 통과 할 인수가 얼마나 많은지 아는 데 문제가있는 한, query.executewithmap 또는 query.executewithArray를 사용하여 알 수없는 수의 인수가있는 쿼리를 실행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top