Converter List em CachedRowSetImpl

9 respostas
J

Alguém sabe como converter List para CachedRowSetImpl?

Se souberem passar de List para ResultSet também resolve o problema.

9 Respostas

Rafael_Steil

Nao eh possivel. Voce tera que usar uma abordagem diferente.

O que esta tentando fazer?

Rafael

J

Eu tenho uma List que resulta de uma query à base de dados. Esta list contém uma lista de objectos que preciso de passar para o flash remoting. A passagem de dados para o flash tem de ser feita através de resultset. O que me dava jeito era uma classe que me inseri-se a metadata e os dados da list no CachedRowSetImpl.

Rafael_Steil

Tem um povo que diz que um workaround seria passar arrays / maps e fazer a conversao.

Uma coisa que talvez funcione para voce eh implementar o java.sql.ResultSet ( ou equivalente ), usando os dados do arraylist. Algo como

List dados = // ...

class DummyResultSet implements ResultSet {
    private List dados;

    public DummyResultSet(List dados) {
        this.dados = dados;
    }

    // implementa os getXxx() da interface e tudo mais
    // o que for necessario
}

...

ResultSet rs = new DummyResultSet(listaComObjetos);
// envia para o Flash

Rafael

Rafael_Steil

Embora acredito que voce ja tenha lido, este documento - http://www.macromedia.com/software/flashremoting/downloads/sampleapp/files/flash_remoting_for_java.pdf - tem uns exemplos legais para fazer o que voce esta querendo, passando um javabean ao inves do resutlset.

Rafael

J

eu preciso mesmo é de inserir a metadata, porque ela não existe. Uso o hibernate para obter a list. Ao passar os dados para um CachedRowSetImpl tenho de criar RowSetMetaDataImpl e estou com dificuldades. O Java não me deixa inserir linhas (row’s)
dá o seguinte erro

java.sql.SQLException: Failed to insert Row

at com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5122)

Antes foi inserida a informação do total de linhas e os nomes das coluna bem como os tipos.

J

a criação de uma claase que implementa o interface ResultSet não me deixa criar instâncias pois tenho de na declaração da classe ela tem de ser abstrata

Rafael_Steil

Pq tem que ser abstrata? Se, por algum motivo, a tua regra de negocios exiga isso, o que te impede de ter uma implementacao concreta?

Rafael

J

A classe tem de ser abstracta porque implementa um interface abstracto.

Não consigo compilar a classe sem que ela seja abstracta.

E quanto à inserção manual da metadata numa CachedRowSetImpl, alguma ideia?

Como exemplo, apresento um pequeno código que deveria inserir a metadata mais os dados da List num CachedRowSetImpl. No entanto, quando chega à instrução result.insertRow(); o programa dá erro.
Alguma sugestão?
Penso que a metadata não esteja bem inserida, ou que falta alguma coisa.

Exemplo,

public CachedRowSetImpl converterLC(List list)

{

CachedRowSetImpl result= null;

try

{

result = new CachedRowSetImpl();
//inserir metadata
  RowSetMetaDataImpl rmd =  new RowSetMetaDataImpl();
  rmd.setColumnCount(list.size());

  rmd.setColumnName(1,"ID");
  rmd.setColumnName(2,"NOME");
  rmd.setColumnName(3,"MORADA");

  rmd.setColumnType(1,Types.INTEGER);
  rmd.setColumnType(2,Types.VARCHAR);
  rmd.setColumnType(3,Types.VARCHAR);

  result.setMetaData(rmd);

 JB_TESTES2 obj = (JB_TESTES2) list.get(0);

    result.moveToInsertRow();
    result.updateInt("ID", obj.getId());
    result.updateString("NOME",obj.getNome());
    result.updateString("MORADA",obj.getMorada());

    result.insertRow();
    result.moveToCurrentRow();
    result.acceptChanges();

} catch(SQLException e)
  {
    e.printStackTrace();
  }
return result;

}

Este código deveria inserir a primeira linha com os dados da list

cv1

Assim nao vai dar certo - voce vai acabar implementando um driver JDBC pra lidar com Collections. Use o suporte a Collections do Flash Remoting :wink:

Criado 14 de abril de 2005
Ultima resposta 15 de abr. de 2005
Respostas 9
Participantes 3