Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从一个POST请求中处理3个不同的响应_Java_Postgresql_Rest_Post - Fatal编程技术网

Java 从一个POST请求中处理3个不同的响应

Java 从一个POST请求中处理3个不同的响应,java,postgresql,rest,post,Java,Postgresql,Rest,Post,我正在尝试更改以下代码,使其只进行一个查询,而不是两个查询。问题是,您可以看到我需要返回3种可能的响应。如果不满足任何条件,则默认值为底部的404,如果登录凭据正确但帐户已过期,则返回第二个404响应。如果帐户正确且处于活动状态,则返回唯一有效的响应200 如何将SELECT语句组合成一个语句,同时根据用户的状态保留以3种不同方式响应的能力 @POST @Path("accounts/initial/{user}") @Produces("application/json

我正在尝试更改以下代码,使其只进行一个查询,而不是两个查询。问题是,您可以看到我需要返回3种可能的响应。如果不满足任何条件,则默认值为底部的404,如果登录凭据正确但帐户已过期,则返回第二个404响应。如果帐户正确且处于活动状态,则返回唯一有效的响应200

如何将SELECT语句组合成一个语句,同时根据用户的状态保留以3种不同方式响应的能力

    @POST
    @Path("accounts/initial/{user}")
    @Produces("application/json")
    @Consumes("application/json")
    public Response validate(@PathParam("user") final String username) {

        PreparedStatement statement = null;
        ResultSet rs = null;
        Connection conn = null;
        try {
            conn = LicenseDBSource.getInstance().getConnection();
            statement = conn.prepareStatement("SELECT * FROM members WHERE username = ?");
            statement.setString(1, username);
            rs = statement.executeQuery();

            if (rs.next()) {
                statement = conn.prepareStatement("SELECT * FROM members WHERE
                username = ? AND LOCALTIMESTAMP < expiration");
                statement.setString(1, username);

                rs = statement.executeQuery();
                if (rs.next()) {
                    return Response.status(200).build();
                    }
                } else {
                    return Response.status(404).entity("Expired").build();
                }
            }
        } catch (...) {
           ...handle exceptions...
        } finally {
            closeResources(...);
        }
        return Response.status(404).entity("Incorrect").build();
    }

“我的数据库”包含包括用户名和过期日期在内的列。

如果您想用一条语句执行两个查询,您可以只使用两个子查询。您的try块如下所示:

try {
    conn = LicenseDBSource.getInstance().getConnection();
    statement = conn.prepareStatement(
        "SELECT " + 
        "   EXISTS (SELECT * FROM members WHERE username = ?) AS user_exists, " +
        "   EXISTS (SELECT * FROM members WHERE username = ? " + 
                       " AND LOCALTIMESTAMP < expiration) AS user_is_current" ;
    statement.setString(1, username);
    statement.setString(2, username);
    rs = statement.executeQuery();
    rs.next(); // There will *always* be one row
    if (rs.getBoolean("user_exists")) {
        if (rs.getBoolean("user_is_current") {
            return Response.status(200).build();
        } else {
            return Response.status(404).entity("Expired").build();
        }
    }
或者,使用单个查询,但这次您有两个选项:它要么不返回任何行,表示用户不存在;要么仅返回一行,假设usrname是PK,并带有一个计算列,告诉您该用户是否为当前用户。这实际上比以前的方法更干净,所需时间更少:

try {
    conn = LicenseDBSource.getInstance().getConnection();
    statement = conn.prepareStatement(
        "SELECT " + 
        "    (LOCALTIMESTAMP < expiration) AS user_is_current " +
        "FROM " +
        "    members WHERE username = ?";

    statement.setString(1, username);
    rs = statement.executeQuery();

    if (rs.next()) {
        if (rs.getBoolean("user_is_current") {
            return Response.status(200).build();
        } else {
            return Response.status(404).entity("Expired").build();
        }
    }
}

你试过使用UNION吗?另外:您是否试图解决一个问题,比如性能问题,或者为什么需要合并这些查询?感谢您的反馈,但UNION似乎只将两个查询的响应聚合为一个,但我不知道如何才能区分两个SELECT语句中的哪一个返回了哪一个响应。在这里,联盟似乎也无关紧要,因为我可以简单地使用SELECT*FROM members,其中email=?和LOCALTIMESTAMP