docs: @SuppressWarnings("unchecked")
    public <T> Query where(String name, QueryOperation<T> queryOperation, T... values) {
  
      checkNotEmpty(name, "Name cannot be empty/null, please specify a name to apply operations on.");
      checkNotNull(queryOperation, "QueryOperation cannot be null.");
      checkNotNull(values, "Values to be compared with need to be set to something.");
      if (values.length == 0 && !queryOperation.hasDefaultValue()) {
        throw new IllegalArgumentException("Please specify at least one value to be searched for.");
      }
  
      for (int i = 0; i < values.length; ++i) {
        final T value = values[i];
        checkNotNull(value, "Value at position %d must not be null.", i);
  
        if (value instanceof CharSequence) {
          checkNotEmpty(value.toString(), "Value at position %d must not be empty.", i);
        }
      }
  
      if ((!name.startsWith("sys.") && !name.startsWith("fields."))
          && !CDAContentType.class.isAssignableFrom(type)) {
        throw new IllegalArgumentException("Please specify either a \"sys.\" or a \"fields.\" "
            + "attribute to be searched for. (Remember to specify a ContentType for \"fields.\" "
            + "searches when querying entries.)");
      }
  
      if (name.startsWith("fields.") && !hasContentTypeSet()) {
        throw new IllegalStateException("Cannot request fields of an entry without having a "
            + "content type set first.");
      }
  
      if (values.length == 0) {
        params.put(name + queryOperation.operator, queryOperation.defaultValue.toString());
      } else {
        params.put(name + queryOperation.operator, join(values));
      }
  
      return (Query) this;
    }