MongoDB基於Morphia (三)常用條件

條件
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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章