Java 从一个POST请求中处理3个不同的响应
我正在尝试更改以下代码,使其只进行一个查询,而不是两个查询。问题是,您可以看到我需要返回3种可能的响应。如果不满足任何条件,则默认值为底部的404,如果登录凭据正确但帐户已过期,则返回第二个404响应。如果帐户正确且处于活动状态,则返回唯一有效的响应200 如何将SELECT语句组合成一个语句,同时根据用户的状态保留以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
@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