Comment puis-je avoir la taille d'un java?SQL.ResultSet?

ne devrait-ce pas être une opération assez simple? Cependant, je vois qu'il n'y a pas de méthode size() ou length() .

252
demandé sur Unai Vivi 2008-10-10 20:12:46

15 réponses

resultSet.last() suivi de resultSet.getRow() vous donnera le nombre de lignes, mais il peut ne pas être une bonne idée car il peut signifier la lecture de la table entière sur le réseau et jeter les données. Faites une requête SELECT COUNT(*) FROM ... à la place.

239
répondu finnw 2016-01-14 00:52:15
ResultSet rs = ps.executeQuery();
int rowcount = 0;
if (rs.last()) {
  rowcount = rs.getRow();
  rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
}
while (rs.next()) {
  // do your standard per row stuff
}
78
répondu JeeBee 2012-11-17 23:53:14

eh Bien, si vous avez un ResultSet de type ResultSet.TYPE_FORWARD_ONLY vous voulez le garder de cette façon (et pas pour passer à une ResultSet.TYPE_SCROLL_INSENSITIVE ou ResultSet.TYPE_SCROLL_INSENSITIVE afin d'être en mesure d'utiliser .last() ).

je suggère un hack très agréable et efficace, où vous ajoutez une première ligne fausse/fausse au sommet contenant le nombre de lignes.

exemple

disons que votre requête est la après

select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR
from MYTABLE
where ...blahblah...

et votre sortie ressemble à

true    65537 "Hey" -32768 "The quick brown fox"
false  123456 "Sup"    300 "The lazy dog"
false -123123 "Yo"       0 "Go ahead and jump"
false       3 "EVH"    456 "Might as well jump"
...
[1000 total rows]

reformulez simplement votre code à quelque chose comme ceci:

Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                                         ResultSet.CONCUR_READ_ONLY);
String from_where="FROM myTable WHERE ...blahblah... ";
//h4x
ResultSet rs=s.executeQuery("select count(*)as RECORDCOUNT,"
                           +       "cast(null as boolean)as MYBOOL,"
                           +       "cast(null as int)as MYINT,"
                           +       "cast(null as char(1))as MYCHAR,"
                           +       "cast(null as smallint)as MYSMALLINT,"
                           +       "cast(null as varchar(1))as MYVARCHAR "
                           +from_where
                           +"UNION ALL "//the "ALL" part prevents internal re-sorting to prevent duplicates (and we do not want that)
                           +"select cast(null as int)as RECORDCOUNT,"
                           +       "MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR "
                           +from_where);

votre requête sera maintenant quelque chose comme

1000 null     null null    null null
null true    65537 "Hey" -32768 "The quick brown fox"
null false  123456 "Sup"    300 "The lazy dog"
null false -123123 "Yo"       0 "Go ahead and jump"
null false       3 "EVH"    456 "Might as well jump"
...
[1001 total rows]

donc il suffit de

if(rs.next())
    System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
while(rs.next())
    //do your stuff
17
répondu Unai Vivi 2013-05-24 07:54:41
int i = 0;
while(rs.next()) {
    i++;
}
12
répondu bhaskar 2014-04-18 16:27:38

j'ai eu une exception en utilisant rs.last()

if(rs.last()){
    rowCount = rs.getRow(); 
    rs.beforeFirst();
}

:

java.sql.SQLException: Invalid operation for forward only resultset

il est dû à par défaut il est ResultSet.TYPE_FORWARD_ONLY , ce qui signifie que vous ne pouvez utiliser rs.next()

la solution est:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY); 
9
répondu Dan 2016-01-14 00:59:43

c'est un moyen simple de faire des lignes-Compter.

ResultSet rs = job.getSearchedResult(stmt);
int rsCount = 0;

//but notice that you'll only get correct ResultSet size after end of the while loop
while(rs.next())
{
    //do your other per row stuff 
    rsCount = rsCount + 1;
}//end while
4
répondu CounterSpell 2012-09-30 01:49:38

La façon d'obtenir la taille d'un jeu de résultats, Pas besoin de l'aide de liste de tableaux etc

int size =0;  
if (rs != null)   
{  
rs.beforeFirst();  
 rs.last();  
size = rs.getRow();
}

Maintenant, vous obtiendrez la taille, et si vous voulez imprimer le jeu de résultats, avant d'imprimer utiliser la ligne de code trop,

rs.beforeFirst();  
3
répondu Anptk 2014-08-28 07:59:34

[prise en compte de la vitesse]

Lot de ppl ici suggère ResultSet.last() mais pour cela, vous auriez besoin d'ouvrir la connexion comme un ResultSet.TYPE_SCROLL_INSENSITIVE qui, pour Derby embedded database est jusqu'à 10 fois plus lent que ResultSet.TYPE_FORWARD_ONLY .

selon mes micro-tests pour les bases de données embedded Derby et H2, il est beaucoup plus rapide d'appeler SELECT COUNT(*) avant votre SELECT.

voici plus de détails mon code et mes repères

3
répondu Vit Bernatik 2017-05-23 12:10:46

j'ai vérifié la valeur d'exécution de l'interface ResultSet et j'ai découvert que c'était à peu près un Resultetimpl tout le temps. Resultetimpl a une méthode appelée getUpdateCount() qui renvoie la valeur que vous recherchez.

cet échantillon de code devrait suffire:

ResultSet resultSet = executeQuery(sqlQuery);

double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()

je me rends compte que passer est généralement une procédure dangereuse, mais cette méthode n'a pas encore échoué moi.

1
répondu clausavram 2013-06-02 17:06:56
        String sql = "select count(*) from message";
        ps =  cn.prepareStatement(sql);

        rs = ps.executeQuery();
        int rowCount = 0;
        while(rs.next()) {
            rowCount = Integer.parseInt(rs.getString("count(*)"));
            System.out.println(Integer.parseInt(rs.getString("count(*)")));
        }
        System.out.println("Count : " + rowCount);

     }
1
répondu Peter.Chu 2013-08-27 04:43:16

Aujourd'hui, j'ai utilisé cette logique pourquoi je ne sais pas obtenir le compte de RS.

int chkSize = 0;
if (rs.next()) {
    do {  ..... blah blah
        enter code here for each rs.
        chkSize++;
    } while (rs.next());
} else {
    enter code here for rs size = 0 
}
// good luck to u.
1
répondu parksangdonews 2017-11-06 09:55:55
theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet theResult=theStatement.executeQuery(query); 

//Get the size of the data returned
theResult.last();     
int size = theResult.getRow() * theResult.getMetaData().getColumnCount();       
theResult.beforeFirst();
0
répondu Ben 2013-03-13 15:25:04

j'avais le même problème. En utilisant ResultSet.first() de cette façon juste après l'exécution résolu:

if(rs.first()){
    // Do your job
} else {
    // No rows take some actions
}

Documentation ( lien ):

boolean first()
    throws SQLException

déplace le curseur à la première ligne de cet objet ResultSet .

Retourne:

true si le curseur est sur une ligne; false si il n'y a pas de lignes dans le jeu de résultats

lancers:

SQLException - si une erreur d'accès à la base de données se produit, cette méthode est appelée sur un jeu de résultats fermé ou le type de jeu de résultats est TYPE_FORWARD_ONLY

SQLFeatureNotSupportedException - si le pilote JDBC ne supporte pas cette méthode

Puisque:

1.2

0
répondu Israel Hernández 2014-11-06 15:48:22

donner un nom à la colonne..

String query = "SELECT COUNT(*) as count FROM

référencez cette colonne de L'objet ResultSet dans un int et faites votre logique à partir de là..

PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, item.getProductId());
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
    int count = resultSet.getInt("count");
    if (count >= 1) {
        System.out.println("Product ID already exists.");
    } else {
        System.out.println("New Product ID.");
    }
}
0
répondu ReMaX 2018-05-11 20:03:57

similaire à la méthode de Garret,

boolean isEmpty = true
while(rs.next()){
    isEmpty = false;
    //do stuff here
}

simple et sympathique, et nous n'avons pas d'potentiellement géant entier généré. Cela suppose naturellement que nous voulons itérer au-dessus de notre ensemble de résultats. Si nous ne voulons pas répéter sur elle, alors faire un compte devrait suffire.

-3
répondu Adam Traub 2016-06-13 17:27:06