代码之家  ›  专栏  ›  技术社区  ›  JohnIdol

在*用户*类型上查询时出现Google数据存储问题

  •  1
  • JohnIdol  · 技术社区  · 16 年前

    this 问题一解决了用户(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);
    

    上面的工作很好,但是经过一些混乱之后,我意识到这种语法不太实际,因为需要构建更复杂的查询,所以我决定手动构建我的过滤器,现在我得到了如下的例子(其中过滤器通常作为字符串变量传入,但现在是为simplic内联构建的):

    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@gmail.com',然后当我将它设置为参数时(上面的情况很好),我将把这个参数声明为一个字符串,然后传递一个用户(user)的实例,这个实例用一个简单的 toString() (我猜)。

    有人知道吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Nick Johnson    16 年前

    在查询语言中使用字符串替换是 总是 一个坏主意。对于一个用户来说,要打破和破坏您的环境太容易了,而且它引入了一整套编码问题等。

    您以前的参数替换方法有什么问题?据我所知,它支持一切,并且回避任何解析问题。对于知道要传递多少参数的问题,可以使用query.ExecuteWithMap或query.ExecuteWithArray来执行参数数目未知的查询。

    推荐文章