條件
public enum FilterOp {
EQ(" ="),
NEQ(" !="),
GT(" >"),
LT(" <"),
GTE(" >="),
LTE(" <="),
IN(" in"),
NIN(" nin"),
ALL(" all"),
SIZE(" size"),
EXISTS(" exists"),
LIKE(" exists");
private String operator;
private FilterOp(String operator) {
this.operator = operator;
}
public String getOperator() {
return this.operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
}
public class FieldFilter {
private String field;
private FilterOp operator;
private Object value;
public FieldFilter(String field, FilterOp operator, Object value) {
this.field = field;
this.operator = operator;
this.value = value;
}
public String getField() {
return this.field;
}
public void setField(String field) {
this.field = field;
}
public FilterOp getOperator() {
return this.operator;
}
public void setOperator(FilterOp operator) {
this.operator = operator;
}
public Object getValue() {
return this.value;
}
public void setValue(Object value) {
this.value = value;
}
}
EQ
new FieldFilter(字段名, FilterOp.EQ, ShowStatus.PUTAWAY.getStatus())
IN
new FieldFilter(字段名, FilterOp.IN, list集合)
like
package java.util.regex;==》Pattern包
new FieldFilter(SinglePage.TITLE, FilterOp.LIKE, Pattern.compile(".*" + title + ".*$", Pattern.CASE_INSENSITIVE))
一條件搜索多字段複合的
例如 name= 張三 則搜索authorName = 張三 or bookName = 張三
@Override
public BookResponse bookSearch(String param, int pageNo, int pageSize, String channelCode) {
List<FieldFilter> vagueParams = new ArrayList<>();
List<FieldFilter> filters = new ArrayList<>();
if (StringUtils.isNotBlank(param)) {
vagueParams.add(new FieldFilter(ChannelBooks.MAIN_TITLE, FilterOp.EQ, param));
vagueParams.add(new FieldFilter(ChannelBooks.AUTHOR_NAME, FilterOp.EQ, param));
}
filters.add(new FieldFilter(ChannelBooks.SHOW_STATUS, FilterOp.EQ, ShowStatus.PUTAWAY.getStatus()));
Channel channel = getChannelByCode(channelCode);
if (channel == null || !channel.isNormal()) {
LOGGER.info("channel is null");
return null;
}
filters.add(new FieldFilter(ChannelBooks.CHANNEL_CODE, FilterOp.EQ, channelCode));
PageBounds pageBounds = new PageBounds(pageNo, pageSize);
PageList<ChannelBooks> pages = channelBooksManager.findByPage(filters, pageBounds, vagueParams);
return convertResp(pages, channelCode);
}
@Override
public PageList<ChannelBooks> findByPage(List<FieldFilter> params, PageBounds ageBounds, List<FieldFilter> vagueParams) {
Query<ChannelBooks> query = getDao().createQuery();
for (FieldFilter filter : params) {
Object value = filter.getValue();
if (null == value) {
continue;
}
if (value instanceof String && StringUtils.isEmpty(((String) value))) {
continue;
}
query.filter(filter.getField() + filter.getOperator().getOperator(), value);
}
if (vagueParams != null) {
Criteria[] arry = new Criteria[vagueParams.size()];
int index = 0;
for (FieldFilter filter : vagueParams) {
Object value = filter.getValue();
arry[index] = query.criteria(filter.getField()).contains(value.toString());
index++;
}
query.or(arry);
}
List<Order> orderBys = ageBounds.getOrders();
String orderby = StringUtils.EMPTY;
for (Order order : orderBys) {
String dir = (order.getDirection() == Order.Direction.ASC) ? StringUtils.EMPTY : SeparatorConstant.HYPHEN;
if (StringUtils.isNotBlank(orderby)) {
orderby += ",";
}
orderby += dir + order.getProperty();
}
if (StringUtils.isNotBlank(orderby)) {
query.order(orderby);
}
query.offset(ageBounds.getOffset());
query.limit(ageBounds.getLimit());
List<ChannelBooks> findList = getDao().find(query).asList();
//分頁
int totalCount = (int) query.countAll();
PageList<ChannelBooks> list = new PageList<>();
Pagination pagination = new Pagination(ageBounds.getPage(), ageBounds.getLimit(), totalCount);
list.setPagination(pagination);
list.addAll(findList);
return list;
}