package org.hsweb.web.service; import org.hsweb.ezorm.core.dsl.Query; import org.hsweb.web.bean.common.PagerResult; import org.hsweb.web.bean.common.QueryParam; import org.hsweb.web.dao.GenericMapper; import java.util.List; public interface QueryService<Po, Pk> { /** * 分页进行查询数据,查询条件同 {@link GenericService#select} * * @param param 查询参数 * @return 分页结果 * @ 查询异常 */ PagerResult<Po> selectPager(QueryParam param); /** * 根据查询参数进行查询,参数可使用 {@link Query}进行构建 * 推荐使用 {@link this#createQuery()}进行查询 * * @param param 查询参数 * @return 查询结果 * @see Query */ List<Po> select(QueryParam param); List<Po> select(); /** * 查询记录总数,用于分页等操作。查询条件同 {@link GenericService#select} * * @param param 查询参数 * @return 查询结果,实现mapper中的sql应指定默认值,否则可能抛出异常 */ int total(QueryParam param); /** * 根据主键查询记录 * * @param pk 主键 * @return 查询结果 */ Po selectByPk(Pk pk); /** * 查询只返回单个结果 * * @param param 查询条件 * @return 单个结果 * @see this#select(QueryParam) */ default Po selectSingle(QueryParam param) { param.doPaging(0, 1); List<Po> list = this.select(param); if (list.size() == 0) return null; else return list.get(0); } /** * 创建本服务的dsl查询操作对象 * 可通过返回的Query对象进行dsl方式操作如:<br> * <code> * createQuery().where("id",1).single(); * </code> * * @return {@link Query} * @see Query * @see org.hsweb.ezorm.core.Conditional * @since 2.2 */ default Query<Po, QueryParam> createQuery() { Query<Po, QueryParam> query = Query.empty(new QueryParam()); query.setListExecutor(this::select); query.setTotalExecutor(this::total); query.setSingleExecutor(this::selectSingle); return query; } /** * 指定一个dao映射接口,接口需继承{@link GenericMapper}创建dsl数据查询对象<br> * 可通过返回的Query对象进行dsl方式操作如:<br> * <code> * createQuery(userMapper).where("id",1).single(); * </code> * * @param mapper dao映射结构 * @param <PO> PO泛型 * @param <PK> 主键泛型 * @return {@link Query} * @see Query * @see org.hsweb.ezorm.core.Conditional * @since 2.2 */ static <PO, PK> Query<PO, QueryParam> createQuery(GenericMapper<PO, PK> mapper) { Query<PO, QueryParam> query = new Query<>(new QueryParam()); query.setListExecutor(mapper::select); query.setTotalExecutor(mapper::total); query.setSingleExecutor((param) -> { param.doPaging(0, 1); List<PO> list = mapper.select(param); if (null == list || list.size() == 0) return null; else return list.get(0); }); return query; } }