使用Java检查谷歌的数据存储区中是否已存在用户名

时间:2015-03-19 21:42:04

标签: java jsp google-app-engine google-cloud-datastore

编辑: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;
}

编辑结束

原帖 好吧所以我花了整整一天试图这样做并尽力研究它,但我不能这样做! :(

我觉得有可能和简单的答案,但我无法解决,我觉得我已经尝试了一切!请帮助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(用户名,密码)) 该代码使用java 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语句为true,我试图只转到顶部代码的下一页,这意味着用户名确实存在,最终我希望它只在用户名和密码都是的情况下转到下一页在同一实体中,即组合存在。

我希望你们明白我要做的事情并且可以帮助我

用户名值的System.out.println()输出:

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

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

2 个答案:

答案 0 :(得分:1)

建议您只查询数据存储区中的感兴趣用户名...:

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来解决这个问题 - 如果 被提升,则意味着你有多个具有该用户名的实体,所以这也是一个return true案例: - )。

核心思想是:获取每个用户实体并在应用程序代码中检查其用户名是非常浪费资源的(除了这种情况下代码中的错误) - 使用查询来只获取相关实体(如果有)! - )

答案 1 :(得分:-1)

下次尝试再搜索一下。这并不难,你的问题很简单。在任何情况下:

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

entity.getProperty("username")

这样你就可以看到你的财产,而不是完整的对象。

更多信息here