@Override
    public ResultPage<Job> find(FindJobCriteria criteria) {
        final Collection<Condition> conditions = JooqUtil.conditions(
                JooqUtil.getStringCondition(JOB.NAME, criteria.getName()));

        final Collection<OrderField<?>> orderFields = JooqUtil.getOrderFields(FIELD_MAP, criteria);
        final int offset = JooqUtil.getOffset(criteria.getPageRequest());
        final int limit = JooqUtil.getLimit(criteria.getPageRequest(), true);
        final List<Job> list = JooqUtil.contextResult(jobDbConnProvider, context -> context
                        .select()
                        .from(JOB)
                        .where(conditions)
                        .orderBy(orderFields)
                        .limit(offset, limit)
                        .fetch())
                .into(Job.class);
        return ResultPage.createCriterialBasedList(list, criteria);
    }
This class is very slim because it uses the GenericDao.
Why event use this class? Why not use the GenericDao directly in the service class?
Some reasons:
1. Hides knowledge of Jooq classes from the service
2. Hides connection provider and GenericDao instantiation -- the service class just gets a working thing injected.
3. It allows the DAO to be easily extended.
<p>
//TODO gh-1072 Maybe the interface could implement the standard methods below? Then this would be even slimmer.
stroom-job/stroom-job-impl-db/src/main/java/stroom/job/impl/db/JobDaoImpl.java