code: private <R,T> Predicate createPredicateFromSingleCriteria(
              CriteriaQuery<R> query, CriteriaBuilder builder,
              Class<T> queryType,
              QueryCriteria criteria, QueryWhere queryWhere) {
  
          Predicate predicate = null;
          assert criteria.hasValues() || criteria.hasDateValues() || Integer.parseInt(criteria.getListId()) < 0
              : "No values present for criteria with list id: [" + criteria.getListId() + "]";
  
          String listId = criteria.getListId();
          Attribute attr = getCriteriaAttributes().get(queryType).get(listId);
  
          if( attr != null ) {
              Expression entityField = getEntityField(query, listId, attr);
              predicate = basicCreatePredicateFromSingleCriteria(builder, entityField, criteria);
          } else {
             predicate = implSpecificCreatePredicateFromSingleCriteria(query, builder, queryType, criteria, queryWhere );
          }
  
          return predicate;
      }
docs: This method is the main method for creating a {@link Predicate} from a (non-group)  {@link QueryCriteria} instance.
  </p>
  If it can not figure out how to create a {@link Predicate} from the given {@link QueryCriteria} instance,
  then the (abstract) {@link #implSpecificCreatePredicateFromSingleCriteria(CriteriaQuery, QueryCriteria, CriteriaBuilder, Root, Class)}
  method is called.
  
  @param query The {@link CriteriaQuery} that is being built
  @param criteria The given {@link QueryCriteria} instance
  @param builder The {@link CriteriaBuilder} builder instance
  @param queryType The (persistent {@link Entity}) {@link Class} that we are querying on
  @return A {@link Predicate} created on the basis of the given {@link QueryCriteria}