【问题标题】:Google Datastore problem with query on *User* type对 *User* 类型的查询的 Google Datastore 问题
【发布时间】:2010-10-30 07:13:45
【问题描述】:

this 问题上,我解决了查询Google Datastore 以按用户(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 并且它在其他字段(字符串类型和枚举)上也能正常工作,这也不起作用。另一个奇怪的事情是,在应用引擎仪表板中查看数据查看器时,“作者”字段存储为类型 User,但值是“user@gmail.com”,然后当我将它设置为参数(上面的情况很好)我将参数声明为字符串,然后传递一个用户(用户)的实例,该实例使用简单的toString()(我猜)进行序列化。

有人知道吗?

【问题讨论】:

    标签: google-app-engine jdo google-cloud-datastore jdoql


    【解决方案1】:

    在查询语言中使用字符串替换总是是个坏主意。用户很容易破坏并弄乱您的环境,并且会引入一整套编码问题等。

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

    【讨论】:

    • 您好,感谢您的回答 - 这表明参数替换有什么问题(问了另一个问题,因为它是一个略有不同的问题)
    • 我现在正在使用 Query.executeWithArray - 感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多