2010-11-25 5 views
7

Je travaille actuellement sur un projet de migration, pour migrer des données de l'ancienne base de données vers la nouvelle (ne demandez pas pourquoi je passe par une application Java pour cela, c'est ce que le client demande).Requêtes paginées avec JdbcTemplate

Il y avait un code initial que je suis en train de mettre à jour maintenant. L'une des choses que je change est en utilisant le JdbcTemplate de Spring plutôt que le code de plaque de chaudière qui était là.

Malheureusement, je ne l'ai pas trouvé un moyen encore d'exécuter paginés requêtes sur un JdbcTemplate, analogique à l'ancien code:

Statement statement = getConnection().createStatement(
    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
statement.setFetchDirection(ResultSet.FETCH_FORWARD); 
statement.setFetchSize(1000); 
return statement.executeQuery(); 

Le getConnection() juste retour un objet Connection, créé dans le code JDBC simple (il est ne fait pas partie d'un SessionFactory ou d'une implémentation de framework).

Je boucle ensuite sur le jeu de résultats, mappant les lignes une à la fois. Est-ce que quelqu'un sait s'il existe un moyen facile d'atteindre la même fonctionnalité avec JdbcTemplate?

TIA

+0

* S'il vous plaît ne demandez pas pourquoi je passe par une application Java pour cela, c'est ce que le client a besoin *. C'est aussi une bonne idée. –

+0

Pourriez-vous élaborer à ce sujet s'il vous plaît? – thomaux

+0

Fondamentalement: j'avais Spring Batch à l'esprit. Une grande partie de ce qu'il fait: le traitement des segments, la gestion des transactions, la possibilité de redémarrage, etc. ne serait pas possible avec SQL. –

Répondre

1

Voulez-vous dire sth. comme ça?

SimpleJdbcTemplate template = new SimpleJdbcTemplate(dataSource); 

List<String> result = template.query("SELECT name FROM people WHERE id > ?", 
    new RowMapper<String>() { 

     public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
      return rs.getString("name"); 
     } 

    }, 666 
); 

Ou ceci:

template.getJdbcOperations().query("SELECT name FROM people WHERE id > ?", 
     new Object[] { 666 }, 
     new RowCallbackHandler() { 

      public void processRow(ResultSet rs) throws SQLException { 
       System.out.println(String.format(
        "Got '%s'", rs.getString("name"))); 
      } 

     } 
); 
+0

Pas exactement, cela retournera et maquettera tous les enregistrements avec un ID supérieur à 666. J'ai besoin d'une solution qui retournerait un enregistrement à la fois et le mapperait. Merci pour votre réponse! – thomaux