docs: protected <T> SearchResultsBean<T> find(SearchCriteriaBean criteria, Class<T> type) throws StorageException {
          SearchResultsBean<T> results = new SearchResultsBean<>();
          EntityManager entityManager = getActiveEntityManager();
          try {
              // Set some default in the case that paging information was not included in the request.
              PagingBean paging = criteria.getPaging();
              if (paging == null) {
                  paging = new PagingBean();
                  paging.setPage(1);
                  paging.setPageSize(20);
              }
              int page = paging.getPage();
              int pageSize = paging.getPageSize();
              int start = (page - 1) * pageSize;
  
              CriteriaBuilder builder = entityManager.getCriteriaBuilder();
              CriteriaQuery<T> criteriaQuery = builder.createQuery(type);
              Root<T> from = criteriaQuery.from(type);
              applySearchCriteriaToQuery(criteria, builder, criteriaQuery, from, false);
              TypedQuery<T> typedQuery = entityManager.createQuery(criteriaQuery);
              typedQuery.setFirstResult(start);
              typedQuery.setMaxResults(pageSize+1);
              boolean hasMore = false;
  
              // Now query for the actual results
              List<T> resultList = typedQuery.getResultList();
  
              // Check if we got back more than we actually needed.
              if (resultList.size() > pageSize) {
                  resultList.remove(resultList.size() - 1);
                  hasMore = true;
              }
  
              // If there are more results than we needed, then we will need to do another
              // query to determine how many rows there are in total
              int totalSize = start + resultList.size();
              if (hasMore) {
                  totalSize = executeCountQuery(criteria, entityManager, type);
              }
              results.setTotalSize(totalSize);
              results.setBeans(resultList);
              return results;
          } catch (Throwable t) {
              logger.error(t.getMessage(), t);
              throw new StorageException(t);
          }
      }