Dúvida Hibernate

11 respostas
D

Boa tarde mestres do java, estou tendo um grande problema.

Eu preciso execultar um comando SQL para inserir na tabela via hibernate, alguém de vc´s poderiam me ajudar ?
grato…

sSQL = "Insert into mfccpd(fkempresa, " +
"mes_ref, ano_ref, vlr_rol_mesref, vlr_fndct_mesref, " +
"vlr_mme_mesref,vlr_aneel_mesref, sld_mesant_mesref, " +
"lanc_aneel_mesref219, lanc_aneel_mesref316, vlr_selic_mesref, " +
"sld_totped_mesref) " +
“Values(” + campos.getCod_empresa() + “,” +
+ mesRef + “,” +
+ anoRef + “,” +
+ campos.getVlr_rol_mesref() + “,” +
+ campos.getVlr_fndct_mesref() + “,” +
+ campos.getVlr_mme_mesref() + “,” +
+ campos.getVlr_aneel_mesref() + “,” +
+ campos.getSld_mesant_mesref() + “,” +
+ campos.getLanc_aneel_mesref219() + “,” +
+ campos.getLanc_aneel_mesref316() + “,” +
+ campos.getVlr_selic_mesref() + “,” +
+ campos.getVlr_totped_mesref() + “” +
“)”;

11 Respostas

peczenyj

Vc nunca ouviu falar em PreparedStatement ?

Seria algo como:

Configuration cfg = new Configuration(); cfg.configure("hibernate.cfg.xml"); SessionFactory sf=cfg.buildSessionFactory(); Session sess=sf.openSession(); Statement st=sess.connection().createStatement(); String sql="select * from foo"; st.executeQuery(sql);

victor.godinho

Dê uma olhada no tutorial aqui do GUJ sobre Hibernate…
Porque desse jeito ai… você não está usando uma das melhores partes do hibernate que é o mapeamento.

E PreparedStatement peczenyj?? Isso é JDBC puro, não Hibernate… =P

peczenyj

http://www.hibernate.org/118.html

How can I execute arbitrary SQL using Hibernate?

PreparedStatement ps = session.connection().prepareStatement(sqlString);

Or, if you wish to retrieve managed entity objects, use session.createSQLQuery().

Or, in Hibernate3, override generated SQL using , , and in the mapping document.

D

Pessoal não precisa brigar… Já consegui resolver o código é este :

protected EntityManager getEM() {

return (EntityManager) Component.getInstance(em);

}

public boolean mtIncluirMovFinancCcpd() {

boolean acao = true;
    String sSQL;
    
    mesRef = Integer.parseInt(campos.getMesref());
    anoRef = Integer.parseInt(campos.getAnoref());

    sSQL = "Insert into mfccpd(fkempresa,           					   " +
            "mes_ref, ano_ref, vlr_rol_mesref, vlr_fndct_mesref,           " +
            "vlr_mme_mesref,vlr_aneel_mesref, sld_mesant_mesref,           " +
            "lanc_aneel_mesref219, lanc_aneel_mesref316, vlr_selic_mesref, " +
            "sld_totped_mesref) " +
            "Values(" + campos.getCod_empresa() + "," +
            + mesRef + "," +
            + anoRef + "," +
            + campos.getVlr_rol_mesref() + "," +
            + campos.getVlr_fndct_mesref() + "," +
            + campos.getVlr_mme_mesref() + "," +
            + campos.getVlr_aneel_mesref() + "," +
            + campos.getSld_mesant_mesref() + "," +
            + campos.getLanc_aneel_mesref219() + "," +
            + campos.getLanc_aneel_mesref316() + "," +
            + campos.getVlr_selic_mesref() + "," +
            + campos.getVlr_totped_mesref() + "" +
            ")";
    
    try{
    	EntityManager em = getEM();
		Query q = em.createNativeQuery(sSQL);
		q.executeUpdate();
    }catch (Exception e) {
        status += "Erro: Falha ao gravar os Dados!";
        acao = false;
    }
    return acao;
}

Valeuuu

Vini_Fernandes

Caro diogoallo, apenas comentarei sua decisao em adotar esse esquema de persistencia: o Hibernate é um framework de persistencia que possibilita o programador Java abolir as instrucoes SQL´s de seu codigo, sendo que para isso utilizamos HQL, assim temos varios ganhos, por exemplo: facil leitura e manutencao do codigo! O que voce esta fazendo é uma má pratica do Hibernate, pois com uma instrucao SQL (linguagem nativa) tao longa voce rompe com a ORM (Oriented Relational Mapping), ao menos é dessa forma como entendo a existencia do Hibernate! Procuro sempre evitar SQL em meus codigos!

Abraco

peczenyj

Exatamente. Entretanto imagino que, para acessar bases legadas ou fazer uso de consultas mais performaticas de acordo com o banco de dados, as vezes vc tem que usar SQL.

A questão é que existem outras razões para vc não usar SQL diretamente: as vezes o problema que vc quer resolver, como performance, pode ser resolvido com cache, orientação a objetos, etc.

spycall

Se sua classe “campos” estiver mapeada é mais fácil vc fazer:

getEM().persist(campos);
victor.godinho

peczenyj:
http://www.hibernate.org/118.html

How can I execute arbitrary SQL using Hibernate?

PreparedStatement ps = session.connection().prepareStatement(sqlString);

Or, if you wish to retrieve managed entity objects, use session.createSQLQuery().

Or, in Hibernate3, override generated SQL using , , and in the mapping document.

peczenyj:
Exatamente. Entretanto imagino que, para acessar bases legadas ou fazer uso de consultas mais performaticas de acordo com o banco de dados, as vezes vc tem que usar SQL.

A questão é que existem outras razões para vc não usar SQL diretamente: as vezes o problema que vc quer resolver, como performance, pode ser resolvido com cache, orientação a objetos, etc.

Bem… claro que algo muito importante em um profissional é sua capacidade de percepção da melhor solução para o problema em questão.

insert into () values ()…

Por favor!!! Me digam onde está a consulta nesse SQL do diogo!!! Aproveitem e me digam onde está a perda de performance entre esse insert e um insert através do Hibernate!!!

ahahahhaa

peczenyj

Puxa, estou dormindo e não percebi que era um Insert, wow

/me rola de rir no chão

Vini_Fernandes

Peczenyj , trabalho a pouco tempo com o Hibernate e ainda nao me precisei me preocupar com a performance das minhas transacoes (nem sei como melhora-la caso um dia precise…rsrs), voce pode me dar dois exemplos, um em que voce resolveu utilizando esquemas de cache e outro usando SQL purao???

Valeu

peczenyj

Olha, numa empresa aonde eu trabalhava houve uma query para ORACLE que, usando algo como CONNECTED BY era um pouco mais rapido, porém não lembro como o cache estava configurado, talvez nem tivesse second level cache.

Criado 5 de fevereiro de 2009
Ultima resposta 5 de fev. de 2009
Respostas 11
Participantes 5