Problema com query executada com PreparedStatement

9 respostas
leofdasilva

Bom dia pessoal.

Estou com um probleminha chato… e não consigo identificar.

Tenho a seguinte query:

SELECT B.PartNumber, B.CodigoInterno, B.TituloProduto
  FROM ProdutoTerceiro B
 WHERE
   NOT EXISTS ( SELECT * FROM jos_vm_product A
		         WHERE A.product_sku = B.PartNumber
 		         ORDER BY A.product_sku )

Apenas para informa, a query executa uma consulta no banco para trazer todos os produtos contidos na tabela “ProdutoTerceiro” e que não existe na tabela “jos_vm_product”.

Quando executo esse comando direto no banco (myphpadmin ou SQLDBX) não da erro nenhum… perfeito.

Porem quando passo essa query pra uma string pra poder executar em um PreparedStatement no JAVA o seguinte erro aparece:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT EXISTS ( SELECT * FROM jos_vm_product A WHERE A.product_sku = B.PartNumber O' at line 1

Segue o código JAVA onde executo a query:

public void naoCadastrados() {
        try {
            String query = "SELECT B.PartNumber, B.CodigoInterno, B.TituloProduto "
                    + "FROM ProdutoTerceiro B"
                    + "WHERE "
                    + "NOT EXISTS ( SELECT * FROM jos_vm_product A "
                    + "WHERE A.product_sku = B.PartNumber "
                    + "ORDER BY A.product_sku )";

            PreparedStatement stmt = this.conexaoMYSQL.prepareStatement(query);
            ResultSet rs = stmt.executeQuery();

            List<Encapsulamento> retorno = new ArrayList<>();

            while (rs.next()) {
                Encapsulamento recebe = new Encapsulamento();

                recebe.setCodigoOfficer(rs.getString("CodigoInterno"));
                recebe.setPartNumber(rs.getString("PartNumber"));
                recebe.setTituloProduto(rs.getString("TituloProduto"));
                recebe.setFabricante(rs.getString("Fabricante"));
                recebe.setLinha(rs.getString("Linha"));
                recebe.setPrecoSemIcms(rs.getString("PrecosemICMS"));
                recebe.setPrecoSpContrib(rs.getString("PrecoSPContrib"));
                recebe.setEstoque(rs.getString("Estoque"));
                recebe.setMpDoBem(rs.getString("MPdoBem"));
                recebe.setFilial(rs.getString("Filial"));
                retorno.add(recebe);
            }

            for (int i = 0; i < retorno.size(); i++) {
            System.out.println(retorno.get(1));
            }

            Escreve.setConteudo("Banco        - " + "planilha com produtos não cadastrados gerada.");

            stmt.close();
            rs.close();
        } catch (SQLException ex) {
            Manipula.erro = "Erro         - (" + ex.toString() + ")";
            Manipula.salvaFile("erro");
        }
    }

9 Respostas

leofdasilva

Apenas para informar, descobri o problema! Eu tinha esquecido um espaço depois do “FROM ProdutoTerceiro B”!

:smiley:

DaniloAndrade

Boa Tarde,

a unica coisa que vi no seu codigo é talves um erro na concatenção de Strings

ta faltando um espaço entre "FROM ProdutoTerceiro B" e o "WHERE "

coloca um espaço de pois do “B” e testa novamente.

leofdasilva

Pois é Danilo! Foi isso mesmo que esqueci! Prometo que da próxima vez eu trago um problema mais difícil! kkkkk

Abraços.

DaniloAndrade

rsrs, Quando eu tava respondendo vc já tinha resolvido o problema

leofdasilva

Cara me da uma luz… como eu faço pra salvar esse ArrayList em um arquivo com FileWriter?

DaniloAndrade

que tipo de arquivo? “Txt”

DaniloAndrade

se for num txt eu faria assim

FileWriter writer = new FileWriter(new File("teste.txt"));
		
for(Encapsulamento recebe: retorno){
               writer.write(recebe.getCodigoOfficer()+";"+recebe.setPartNumber()+";"+recebe.setTituloProduto());
	       writer.flush();
}

writer.close();
leofdasilva

Eu fiz assim:

public static void salvaSheet(ArrayList<Encapsulamento> arg) {

String conteudo;
            FileWriter fw = new FileWriter(nomeSheet, false);

            for (int i = 0; i < arg.size(); i++) {
                conteudo = arg.get(i) + "\r\n";
                fw.write(conteudo);
            }

            System.out.println("Arquivo      - " + "planilha com produtos não cadastrados gerada.");
            fw.close();
}

Ai o conteúdo de arg eu pego de outro método que manipula banco (DAO) e ele me retorna um ArrayList do tipo Encapsulamento.

Comi muita bola ou ta bom?

DaniloAndrade

dessa forma vai estourar uma exceção “ClassCastException” pois vc ta tendando pegar um Encapsulamento e passar para uma String “String conteudo;”

Criado 13 de abril de 2012
Ultima resposta 13 de abr. de 2012
Respostas 9
Participantes 2