我正在尝试更改以下代码,以便它只进行一次查询而不是两次查询。问题是,您可以看到我需要返回 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 block 看起来像:
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();
}
}
}
关于java - 处理来自一个 POST 请求的 3 个不同响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874763/