项目需求
一个列表页面有四种查询条件,四种可以单独查询也可以随意组合查询。不仅需要处理在线查询而且还需要离线查询,在线我们可以直接请求接口,离线得我们自己实现了,可以实现的方法很多,我这里使用ormlite实现,ormlite提供了很多查询的方法,如果想了解更多可参考复杂条件查询
我这里需要下面四种查询条件,并且这四种条件可以随意组合查询
- 多个项目id
- 记录的状态
- 时间区间段
- 编号模糊查询

思路
重点:我这里使用了传入sql语句到ormlite中查询的方法。
- 第一步:先自己拼出sql语句
- 第二步:调用ormlite的queryRaw方法查询
private String getSql(String userId, FilterRequestEntity entity) {
String table = DBConstant.TableName.TB_OFFLINE_ASSGININFO;
String sql = "select * from " + table + " where userId = " +
"'" + userId;
StringBuffer stringBuffer = new StringBuffer(sql);
if (entity.getProjectIds() != null && entity.getProjectIds().length != 0) {
String[] projectIds = entity.getProjectIds();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < projectIds.length; i++) {
buffer.append("'" + projectIds[i] + "'");
if (i != projectIds.length - 1) {
buffer.append(",");
} else {
buffer.append(")");
}
}
stringBuffer.append(" and projectId in (" + buffer);
}
if (!StringUtils.isEmpty(entity.getReformOrderCode())) {
String code = "reformOrderCode";
stringBuffer.append(" and " + code + " like " + "'%" + entity.getReformOrderCode() + "%'");
}
if (!StringUtils.isEmpty(entity.getStartTime())) {
String startTime = entity.getStartTime() + " 00:00:00";
stringBuffer.append(" and time >= '" + startTime + "'");
}
if (!StringUtils.isEmpty(entity.getEndTime())) {
String endTime = entity.getEndTime() + " 23:59:59";
stringBuffer.append(" and time <= '" + endTime + "'");
}
return stringBuffer.toString();
}
此处都已经做了空判断,组合中单个和多个条件查询都能满足
String sql = getSql(userId, entity);
List<AssignLocalInfo> results = SimpleDao.Factory.create(AssignLocalInfo.class).getDao().queryRaw(sql, new RawRowMapper<AssignLocalInfo>() {
@Override
public AssignLocalInfo mapRow(String[] columnNames, String[] resultColumns) throws SQLException {
AssignLocalInfo localInfo = new AssignLocalInfo();
for (int i = 0; i < columnNames.length; i++) {
if (StringUtils.equals(columnNames[i], "assignLoacalInfo")) {
localInfo.setAssignLoacalInfo(resultColumns[i]);
}
}
return localInfo;
}
}).getResults();
bean类
public class FilterRequestEntity {
private String status;
private String[] projectIds;
private String reformOrderCode;
private String startTime;
private String endTime;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String[] getProjectIds() {
return projectIds;
}
public void setProjectIds(String[] projectIds) {
this.projectIds = projectIds;
}
public String getReformOrderCode() {
return reformOrderCode;
}
public void setReformOrderCode(String reformOrderCode) {
this.reformOrderCode = reformOrderCode;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
@DatabaseTable(tableName = DBConstant.TableName.TB_OFFLINE_ASSGININFO)
public class AssignLocalInfo {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName = "userId")
private String userId;
@DatabaseField(columnName = "assignProblemId")
private String assignProblemId;
@DatabaseField(columnName = "projectId")
private String projectId;
@DatabaseField(columnName = "reformOrderCode")
private String reformOrderCode;
@DatabaseField(columnName = "time")
private String time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getAssignProblemId() {
return assignProblemId;
}
public void setAssignProblemId(String assignProblemId) {
this.assignProblemId = assignProblemId;
}
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public String getReformOrderCode() {
return reformOrderCode;
}
public void setReformOrderCode(String reformOrderCode) {
this.reformOrderCode = reformOrderCode;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}