docs: public <T> void addRangeQueryParameters(List<? extends Object> paramList, String listId, Class<T> type, String fieldName, String joinClause, boolean union ) {
          List<T> listIdParams;
          if( paramList != null && paramList.size() > 0 ) { 
              Object inputObject = paramList.get(0);
              if( inputObject == null ) { 
                  inputObject = paramList.get(1);
                  if( inputObject == null ) { 
                      return;
                  }
              }  
              listIdParams = checkAndConvertListToType(paramList, inputObject, listId, type);
          } else { 
              return;
          }
          
          T min = listIdParams.get(0);
          T max = listIdParams.get(1);
          Map<String, T> paramNameMinMaxMap = new HashMap<String, T>(2);
          StringBuilder queryClause = new StringBuilder("( " );
          if( joinClause != null ) { 
             queryClause.append("( "); 
          } 
          queryClause.append(fieldName);
          if( min == null ) { 
            if( max == null ) { 
                return;
            } else { 
                // only max
                String maxParamName = generateParamName();
                queryClause.append(" <= :" + maxParamName + " " );
                paramNameMinMaxMap.put(maxParamName, max);
            }
          } else if( max == null ) { 
              // only min
              String minParamName = generateParamName();
              queryClause.append(" >= :" + minParamName + " ");
              paramNameMinMaxMap.put(minParamName, min);
          } else { 
              // both min and max
              String minParamName = generateParamName();
              String maxParamName = generateParamName();
              if( union ) { 
                  queryClause.append(" >= :" + minParamName + " OR " + fieldName + " <= :" + maxParamName + " " );
              } else { 
                  queryClause.append(" BETWEEN :" + minParamName + " AND :" + maxParamName + " " );
              }
              paramNameMinMaxMap.put(minParamName, min);
              paramNameMinMaxMap.put(maxParamName, max);
          } 
          if( joinClause != null ) { 
              queryClause.append(") and " + joinClause.trim() + " ");
          }
          queryClause.append(")");
          
          // add query string to query builder and fill params map
          internalAddToQueryBuilder(queryClause.toString(), union);
          for( Entry<String, T> nameMinMaxEntry : paramNameMinMaxMap.entrySet() ) { 
              addNamedQueryParam(nameMinMaxEntry.getKey(), nameMinMaxEntry.getValue());
          }
          queryBuilderModificationCleanup();
      }