2009-05-31 51 views
1

this问题我解决了查询谷歌数据存储用户(com.google.appengine.api.users.User)这样的检索东西的问题:谷歌数据存储的问题与*用户*类型的查询

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'supported by JDOQL并且它在其他字段(字符串类型和枚举)上正常工作。另一个奇怪的是,在应用程序引擎仪表板中查看数据查看器的'作者'字段存储为类型用户,但值为'[email protected]',然后再次将其设置为参数(上面的情况工作正常)我声明参数为一个字符串,然后传递一个用户(用户)的实例,它被序列化了一个简单的toString()(我猜)。

任何任何想法?

回答

1

在查询语言中使用字符串替换是总是一个坏主意。这对用户来说很容易爆发并且混淆了你的环境,并且它引入了一整套编码问题等。

你以前的参数替换方法有什么问题?据我所知,它支持一切,它回避任何分析问题。至于知道要传递多少个参数的问题,您可以使用Query.executeWithMap或Query.executeWithArray来执行具有未知数量参数的查询。

+0

嗨,感谢您的回答 - 这显示了参数替换的问题(问另一个问题,因为它是一个稍微不同的问题) – JohnIdol 2009-06-02 08:13:11