我正在编写一个查询来自db的记录。我将3个值传递给该方法。我想以这样的方式编写我的查询:该列的条件附加在传递的对应值为非null的查询中。我最后得到了凌乱的if else语句。有没有办法优化它?
if (StringUtils.isNotEmpty(projectId)) {
sql.append(" UPPER(CIRC.PROJECT_ID) like ?");
}
if (StringUtils.isNotEmpty(circuitId)) {
if (StringUtils.isNotEmpty(projectId)) {
sql.append(" AND");
}
sql.append(" UPPER(CIRC.CIRCUIT_ID) like ?");
}
if (StringUtils.isNotEmpty(orderRef)) {
if (StringUtils.isNotEmpty(projectId) || StringUtils.isNotEmpty(circuitId)) {
sql.append(" AND");
}
sql.append(" UPPER(CIRC.ORDERID) like ?");
}
JSONArray jsonArray = new JSONArray();
ResultSet rs = null;
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
PreparedStatement ps = null;
try {
if (connection != null) {
ps = connection.prepareStatement(sql.toString());
if (StringUtils.isNotEmpty(projectId)) {
ps.setString(1, "%" + projectId.toUpperCase() + "%");
}
if (StringUtils.isNotEmpty(circuitId)) {
if (StringUtils.isEmpty(projectId)) {
ps.setString(1, "%" + circuitId.toUpperCase() + "%");
} else {
ps.setString(2, "%" + circuitId.toUpperCase() + "%");
}
}
if (StringUtils.isNotEmpty(orderRef)) {
if (StringUtils.isEmpty(projectId) && StringUtils.isEmpty(circuitId)) {
ps.setString(1, "%" + orderRef.toUpperCase() + "%");
} else if (StringUtils.isEmpty(projectId) || StringUtils.isEmpty(circuitId)) {
ps.setString(2, "%" + orderRef.toUpperCase() + "%");
} else {
ps.setString(3, "%" + orderRef.toUpperCase() + "%");
}
}
注意:此问题不是orm / jdbc的主题。另请注意硬编码。
答案 0 :(得分:2)
您可以这样写下您的附件:
sql.append(" UPPER(CIRC.PROJECT_ID) like ? AND ");
并完成完整条款:
sql.append(" 1=1 ");
答案 1 :(得分:2)
您可以收集列表中的子句并使用“AND”加入,然后将args收集到另一个列表中,例如:
// Uncomment out on Java 6
// import com.google.common.base.Joiner;
List<String> clauses = new ArrayList<>();
List<String> args = new ArrayList<>();
if (StringUtils.isNotEmpty(projectId)) {
clauses.add("UPPER(CIRC.PROJECT_ID) like ?");
args.add(projectId);
}
if (StringUtils.isNotEmpty(circuitId)) {
clauses.add("UPPER(CIRC.CIRCUIT_ID) like ?");
args.add(circuitId);
}
if (StringUtils.isNotEmpty(orderRef)) {
clauses.add("UPPER(CIRC.ORDERID) like ?");
args.add(orderRef);
}
// Java 8 (comment out for Java 6)
sql.append(clauses.stream().collect(Collectors.joining(" AND ")));
// Uncomment for Java 6
// sql.append(Joiner.on(" AND ").join(clauses));
JSONArray jsonArray = new JSONArray();
ResultSet rs = null;
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
PreparedStatement ps = null;
try {
if (connection != null) {
ps = connection.prepareStatement(sql.toString());
for (int i = 0; i < args.size(); ++i) {
ps.setString(i+1, "%" + args.get(i).toUpperCase() + "%");
}
}
}
在Java 6上注释掉Java 8系列并取消注释Java 6系列。同时将Guava添加到您的项目中。
答案 2 :(得分:1)
public static void main (String[]args){
StringBuilder sql = new StringBuilder();
sql.append ("Select * From Table where ");
String projectId = "11";
String circuitId = "";
String orderRef = "33";
sql.append(StringUtils.isNotEmpty(projectId)?" UPPER(CIRC.PROJECT_ID) like ?":"");
sql.append(sql.toString().endsWith("?") && StringUtils.isNotEmpty(circuitId)?" AND":"");
sql.append(StringUtils.isNotEmpty(circuitId)?" UPPER(CIRC.CIRCUIT_ID) like ?":"");
sql.append(sql.toString().endsWith("?")&& StringUtils.isNotEmpty(orderRef)?" AND":"");
sql.append(StringUtils.isNotEmpty(orderRef)?" UPPER(CIRC.ORDERID) like ?":"");
System.out.println(sql.toString());
}