code: public <T> List<T> doCriteriaQuery( QueryWhere queryWhere, Class<T> queryType ) {
          // 1. create builder and query instances
          CriteriaBuilder builder = getCriteriaBuilder();
          CriteriaQuery<T> criteriaQuery = builder.createQuery(queryType);
  
          // query base;
          criteriaQuery.select(criteriaQuery.from(queryType));
  
          fillCriteriaQuery(criteriaQuery, queryWhere, builder, queryType);
  
          List<T> result = createQueryAndCallApplyMetaCriteriaAndGetResult(queryWhere, criteriaQuery, builder);
  
          return result;
      }
docs: This method takes the high-level steps needed in order to create a JPA {@link CriteriaQuery}.
  <ol>
  <li>A {@link CriteriaBuilder} and {@link CriteriaQuery} instance are created.</li>
  <li>The tables being selected from are defined in the query.</li>
  <li>The {@link CriteriaQuery} instance is filled using the criteria in the {@link QueryWhere} instance</li>
  <li>A JPA {@link Query} instance is created</li>
  <li>The meta criteria (max results, offset) are applied to the query</li>
  <li>The results are retrieved and returned</li>
  </ol>
  @param queryWhere a {@link QueryWhere} instance containing the query criteria
  @param queryType The type ({@link Class}) of the result
  @return The result of the query, a {@link List}.