使用 Java 检查用户名是否已存在于 google 的数据存储中

Checking if the username already exists in google's datastore using Java

编辑:Alex Martelli 给了我一个很好的答案,为了让我能正常工作,我只做了一点改动

对我来说这个问题的答案是

public boolean Login2(String usernamein, String passwordin) {
    DatastoreService datastore = DatastoreServiceFactory
            .getDatastoreService();

    Filter usernamefilter = new FilterPredicate("username",
            FilterOperator.EQUAL, usernamein);

    Query validuserquery = new Query("Users").setFilter(usernamefilter)
            .setKeysOnly();

    Entity theUser = datastore.prepare(validuserquery).asSingleEntity();

    if (theUser == null) {
        System.out.println("Username not found");
        return false;
    }
    return true;
}

编辑结束

原创Post 好吧,我花了一整天的时间来尝试做这件事,并尽我最大的努力去研究它,但我做不到! :(

我觉得可能有简单的答案,但我无法解决,我觉得我已经尝试了一切!请请帮助 D:

我有自己的代码登录部分。jsp 页面名为 Index.jsp

String username = "";
    String password = "";

    try {
        if (request.getParameter("usernamein") != null && request.getParameter("passwordin") != null) {
            username = (request.getParameter("usernamein"));
            password = request.getParameter("passwordin");
            if(login.Login2(username, password)){
                response.sendRedirect("Race.jsp");
                System.out.println("go to next page");
            } else {//need username/password
                out.println("your username or password is incorrect");
            }
        }
    } catch (Exception e) {
        out.println("problem in getting u an p error =" + e);
    }

该代码的一部分是行 (login.Login2(username, password)) 该代码使用 java 在 class 中调用方法 use bean thingy 它调用的方法是这样的:

public boolean Login2(String usernamein, String passwordin) {
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Filter usernamefilter = new FilterPredicate("username", FilterOperator.EQUAL, usernamein);

        Query validuserquery = new Query("Users");
        validuserquery.addProjection(new PropertyProjection("username", null));
        System.out.println(validuserquery);

        List<Entity> list = datastore.prepare(validuserquery).asList(FetchOptions.Builder.withLimit(100));
        System.out.println(list);

        for (Entity username : list){
            System.out.println("username is equal to '"+username+"'");
            if(username.equals(usernamein)){
                return true;
            }else
                System.out.println("was not equal");
                return false;
        }
        return false;
    }

如果 if 语句为真,我试图只转到顶部代码中的下一页,这意味着用户名确实存在,最终我希望它只转到下一页,如果用户名和密码都在同一个实体中,即组合存在。

我希望你们明白我想做什么,并能帮助我

哦,用户名值的 System.out.println() 输出如下:

username is equal to '<Entity [user("id")/Users(5910974510923776)]:
    username = RawValue [value=[B@187c4d7]
>
'

如果您需要更多信息,请询问,我会将其添加到 post:D ty

下次尝试多搜索一点。没那么难,你的问题很简单。无论如何:

您的查询 returns 一个完整的对象,而不仅仅是对象的属性。你需要做

entity.getProperty("username")

这样您就可以看到您的 属性,而不是完整的对象。

更多信息here

您最好只查询感兴趣的用户名的数据存储...:[=​​14=]

Query validuserquery = new Query("Users").
    setFilter(new Query.FilterPredicate("username", 
                  Query.FilterOperator.EQUAL,
                  usernamein)
    ).setKeysOnly();
Entity anyentity = datastore.prepare(validuserquery).asSingleEntity();
if(anyentity == null) {
    System.out.println("was not equal");
    return false;
}
return true;

这假设您的商店中没有重复的 username 的实体(尽管您可以通过捕获异常 PreparedQuery.TooManyResultsException 来处理这个问题——如果 that被提升,这意味着您有多个实体使用该用户名,所以这也是 return true 情况:-)。

核心思想是:在您的应用程序代码中获取每个用户实体并检查他们的用户名确实是在浪费资源(在这种情况下除了代码中的错误之外)——使用 queries 只获取 相关的 个或多个实体,如果有的话!-)