[resolvido]5 primeiros com java? e nao com TOP 5, LIMIT 5

Olá Gujeiros,

Bom minha duvida pode ser simples…

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!

:shock:

Use Hibernate, que abstrai o acesso ao banco de dados para você e permite fazer isso de forma portável em código Java.

Assim.

where rownum &lt=5

Porém para utilizar com ordenação existem algoritimos para isso…

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ê

Funciona ok.

Mas os algoritimos de query no oracle são mais performaticos.

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";
	}

:oops:

set rowcount ? :roll:

como funciona esse set rowcount? pode falar como eu colocaria?

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?

SET ROWCOUNT 5
SELECT * FROM GUJ WHERE USER = LUIZ
SET ROWCOUNT 0

ou

SELECT * FROM GUJ WHERE USER = LUIZ AND ROWCOUNT <= 5

:slight_smile:

[quote=Luiz Aguiar]SET ROWCOUNT 5
SELECT * FROM GUJ WHERE USER = LUIZ
SET ROWCOUNT 0

ou

SELECT * FROM GUJ WHERE USER = LUIZ AND ROWCOUNT <= 5

:)[/quote]
Que banco isso funciona?

isso eh padrao SQL???

todos os bancos aceitam???

set rowcount não funciona realmente pra todos os bancos…

se vai ser necessário uma abstração tão grande do banco a ser utilizado eu sugiro que você use hibernate mesmo.

:wink:

pois eh! nao deixaram usar… falaram que isso no momento nao serve, pq ninguem aqui sabe mexer e teriam que treinar e etc… :frowning:

:?

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";
	}