pentaho/pentaho-kettle · error · KettleException

JobEntryEvalTableContent.UnableLoadRep

Error message

JobEntryEvalTableContent.UnableLoadRep

What it means

JobEntryEvalTableContent.loadRep() reads this entry's boolean/string attributes (is_usevars, add_rows_result, clear_result_rows, custom_sql) from the repository; a KettleDatabaseException is rethrown as a KettleException with localized message 'JobEntryEvalTableContent.UnableLoadRep' plus the entry id. The entry's stored settings could not be loaded from the repository database.

Solutions

  1. Check the chained KettleDatabaseException for the JDBC error.
  2. Confirm rows exist in r_jobentry_attribute for the reported id; re-save the entry to recreate them.
  3. Test the repository connection and run schema upgrade if versions differ.
  4. Reload the job once the database is reachable.
Defensive patterns

Strategy: try-catch

Validate before calling

if (!rep.connect()) {
  throw new IllegalStateException("Repository not reachable: " + rep.getName());
}

Try / catch

try {
  JobMeta meta = rep.loadJob(jobName, jobDir, null, null);
} catch (KettleException e) {
  if (e.getCause() instanceof KettleDatabaseException) {
    logError("Repo load of EvalTableContent failed: " + e.getMessage(), e);
  }
  throw e;
}

Prevention

When it happens

Trigger: Loading a job from a repository where rep.getJobEntryAttributeBoolean/String(id_jobentry, ...) throws KettleDatabaseException.

Common situations: Repository DB unreachable or credentials wrong; missing attribute rows after partial save/migration; schema mismatch between client and repository.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/d13dfb0c105e4149. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/evaluatetablecontent/JobEntryEvalTableContent.java:233

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      connection = rep.loadDatabaseMetaFromJobEntryAttribute( id_jobentry, "connection", "id_database", databases );

      schemaname = rep.getJobEntryAttributeString( id_jobentry, "schemaname" );
      tablename = rep.getJobEntryAttributeString( id_jobentry, "tablename" );
      successCondition =
        getSuccessConditionByCode( Const.NVL(
          rep.getJobEntryAttributeString( id_jobentry, "success_condition" ), "" ) );
      limit = rep.getJobEntryAttributeString( id_jobentry, "limit" );
      useCustomSQL = rep.getJobEntryAttributeBoolean( id_jobentry, "is_custom_sql" );
      useVars = rep.getJobEntryAttributeBoolean( id_jobentry, "is_usevars" );
      addRowsResult = rep.getJobEntryAttributeBoolean( id_jobentry, "add_rows_result" );
      clearResultList = rep.getJobEntryAttributeBoolean( id_jobentry, "clear_result_rows" );

      customSQL = rep.getJobEntryAttributeString( id_jobentry, "custom_sql" );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryEvalTableContent.UnableLoadRep", ""
        + id_jobentry ), dbe );
    }
  }

  private static int getSuccessConditionByCode( String tt ) {
    if ( tt == null ) {
      return 0;
    }

    for ( int i = 0; i < successConditionsCode.length; i++ ) {
      if ( successConditionsCode[i].equalsIgnoreCase( tt ) ) {
        return i;
      }
    }
    return 0;
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {

View on GitHub (pinned to f3058517a1)