Como eu recupero apenas os 5 primeiros (TOP 5 - SQLServer, LIMIT 5 MySQL, xxx Oracle…) mas sem usar as funçoes no comando SQL? Meu sistema trabalha para todos os bancos de dados, por isso eh necessario, acho que ajuda a muita gente tambem!
Você pode fazer a sua consulta, e quando for percorrer o teu resultset fazer algo assim
int cont = 0;
List dados = new ArrayList(5);
while (rs.next() && cont < 5) {
dados.add( rs.getString(1);
cont++;
}
P.S.: O seu sistema não possui uma camada DAO?! Se sim, você pode fazer um teste, dependendo da instância do banco que for retornada, utilizar a cláusula select certa para você
nao tiago acho que isso nao funciona… vou mostra o meu codigo funcionando para MySQL ai vcs da uma olhada e irão entender pq e como ta feito.
ps: esse ai jah funciona perfeitamente, a duvida eh como fazer sem usar functions no MySQL ou de qualquer outro banco como o “LIMIT 5” nesse caso.
public Object produceDataset(Map arg0) throws DatasetProduceException {
// Criando um Dataset para o gráfico
DefaultPieDataset ds = new DefaultPieDataset();
PreparedStatement ps = null;
Connection conexao = null;
try {
conexao = dao.getConnection();
//alterar a string SQL
String SQL = "SELECT cpu.proc_max_speed, COUNT(cpu.proc_max_speed) as qtde FROM estacao as cpu "
+ "GROUP BY cpu.proc_max_speed "
+ "LIMIT 5";
// Recupera uma conexão com o banco
ps = conexao.prepareStatement(SQL);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// Inserindo no DataSet o estado e a quantidade de pessoas certificadas
ds.setValue(rs.getString(1), new Double(rs.getInt(2)));
}
rs.close(); //Fecha o resultSet para liberar recursos alocados
}
catch(Exception e){
new DatasetProduceException(e.getMessage());
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
new DatasetProduceException(e1.getMessage());
}
}
// retorna o DataSet
return ds;
}
// O dados deste dataset é invalidado imediatamente.
// O tempo de retorno influencia no cachê de dados do cewolf
// Retornando sempre true, os dados do dataset são sempre atualizados a cada request.
public boolean hasExpired(Map arg0, Date arg1) {
return true;
// Se quiséssemos que os dataset expirasse em 5 segundos colocaríamos
// return (System.currentTimeMillis() - since.getTime()) > 5000;
}
// Retorna um Id único para este dataset
public String getProducerId() {
return "CPUGrafico";
}
Bem isso não existe no ANSI SQL 99.
Você terá que fazer uma gâmbia.
Sugiro que vc faça uma view na base de dados incluindo um campo com contagem de campos.
Assim vc evita mexer no seu código.
Mas porque não pode ser o comando do sql proprietário? Você vai mudar tanto de banco assim?
pois eh! nao deixaram usar… falaram que isso no momento nao serve, pq ninguem aqui sabe mexer e teriam que treinar e etc…
:?
eu fiz isso:
public Object produceDataset(Map arg0) throws DatasetProduceException {
// Criando um Dataset para o gráfico
DefaultPieDataset ds = new DefaultPieDataset();
PreparedStatement ps = null;
Connection conexao = null;
try {
int contador = 0;
conexao = dao.getConnection();
//alterar a string SQL
String SQL = "SELECT cpu.proc_max_speed, COUNT(cpu.proc_max_speed) as qtde FROM estacao as cpu "
+ "GROUP BY cpu.proc_max_speed ";
// Recupera uma conexão com o banco
ps = conexao.prepareStatement(SQL);
ResultSet rs = ps.executeQuery();
while (rs.next() && contador<=4) {
// Inserindo no DataSet o estado e a quantidade de pessoas certificadas
ds.setValue(rs.getString(1), new Double(rs.getInt(2)));
contador++;
}
rs.close(); //Fecha o resultSet para liberar recursos alocados
}
catch(Exception e){
new DatasetProduceException(e.getMessage());
}finally{
/*
* Libera a conexão de volta para o Pool.
*/
try {
conexao.close();
}catch(SQLException e1){
new DatasetProduceException(e1.getMessage());
}
}
// retorna o DataSet
return ds;
}
// O dados deste dataset é invalidado imediatamente.
// O tempo de retorno influencia no cachê de dados do cewolf
// Retornando sempre true, os dados do dataset são sempre atualizados a cada request.
public boolean hasExpired(Map arg0, Date arg1) {
return true;
// Se quiséssemos que os dataset expirasse em 5 segundos colocaríamos
// return (System.currentTimeMillis() - since.getTime()) > 5000;
}
// Retorna um Id único para este dataset
public String getProducerId() {
return "CPUGrafico";
}