code: public QueryResult executeQuery() throws ReportRunnerException, InterruptedException {
  		if (connection == null) {
  			throw new ReportRunnerException("Connection is null!");
  		}
  		if (report == null) {
  			throw new ReportRunnerException("Report is null!");
  		}
  
  		String sql = getSql();
  
  		// retrieves the report parameters
  		Map<String, QueryParameter> parameters = getReportParameters();
  
  		if (QueryUtil.restrictQueryExecution(sql)) {
  			throw new ReportRunnerException("You are not allowed to execute queries that modify the database!");
  		}
  
  		if (QueryUtil.isProcedureCall(sql)) {
  			if (!QueryUtil.isValidProcedureCall(sql, dialect)) {
  				throw new ReportRunnerException("Invalid procedure call! Must be of form 'call (${P1}, ?)'");
  			}
  		}
  
  		QueryResult queryResult = null;
  		try {
  			Query query = getQuery(sql);
  			QueryExecutor executor = new QueryExecutor(query, parameters, parameterValues, connection, count, true,
  					csv);
  			executor.setMaxRows(0);
  			executor.setTimeout(queryTimeout);
  
  			queryResult = executor.execute();
  
  			return queryResult;
  		} catch (Exception e) {
  			throw new ReportRunnerException(e);
  		}
  
  	}
docs: Execute query This method is useful in case you are not interested about
  report layout, but only query and you want to make your own business.
  
  @return QueryResult object
  
  @throws ReportRunnerException
  if Runner object is not correctly configured
  @throws InterruptedException
  if process was interrupted