Consulta com atributo de outra classe usando Hibernate

5 respostas
java
A

Estou com um problema ao executar um SQL com um atributo de uma outra classe no Java, estou usando Hibernate.

public List<Produto> getProdutoPorSituacao(String stProduto){
    String par = stProduto.toUpperCase();
    Session sessao = HibernateUtil.getSession();
    sessao.beginTransaction();
    try{
        return sessao.createQuery("from Produto where stProduto like '"+par+"' order by idProduto").list();
    }catch (Exception e){
        mensagem = TrataException.trataException(e);
        return null;
    }finally{
        sessao.close();
    }
}

public List<Produto> getProdutoPorMarca(String marca){
    String par = marca.toUpperCase();
    String sql = "from Produto prod left join Marca marc on marc.idMarca = prod.idMarca where marc.dsMarca like '%"+par+"%' order by idProduto";
    Session sessao = HibernateUtil.getSession();
    sessao.beginTransaction();
    try{
        return sessao.createSQLQuery(sql).list();
    }catch (HibernateException e){
        mensagem = TrataException.trataException(e);
        return null;
    }finally{
        sessao.close();
    }
}

Este é o código, o primeiro trecho funciona normalmente, pois pega um atributo da propria classe Produto, já o outro dá o erro abaixo, pois pega um atributo de outra tabela.

org.hibernate.exception.SQLGrammarException: ERROR: syntax error at or near from

Posição: 1

at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)

at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)

at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)

at com.sun.proxy.$Proxy11.executeQuery(Unknown Source)

at org.hibernate.loader.Loader.getResultSet(Loader.java:1962)

at org.hibernate.loader.Loader.doQuery(Loader.java:829)

at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)

at org.hibernate.loader.Loader.doList(Loader.java:2447)

at org.hibernate.loader.Loader.doList(Loader.java:2433)

at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263)

at org.hibernate.loader.Loader.list(Loader.java:2258)

at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331)

at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1697)

at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:227)

at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156)

at br.projeto.sistoque.controlador.ProdutoCon.getProdutoPorMarca(ProdutoCon.java:151)

at br.projeto.sistoque.view.ProdutoForm.readJTableForMarca(ProdutoForm.java:112)

at br.projeto.sistoque.view.ProdutoForm.btnPesquisarActionPerformed(ProdutoForm.java:425)

at br.projeto.sistoque.view.ProdutoForm.access$800(ProdutoForm.java:18)

at br.projeto.sistoque.view.ProdutoForm$9.actionPerformed(ProdutoForm.java:258)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)

at java.awt.Component.processMouseEvent(Component.java:6533)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

at java.awt.Component.processEvent(Component.java:6298)

at java.awt.Container.processEvent(Container.java:2236)

at java.awt.Component.dispatchEventImpl(Component.java:4889)

at java.awt.Container.dispatchEventImpl(Container.java:2294)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)

at java.awt.Container.dispatchEventImpl(Container.java:2280)

at java.awt.Window.dispatchEventImpl(Window.java:2746)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)

at java.awt.EventQueue$4.run(EventQueue.java:731)

at java.awt.EventQueue$4.run(EventQueue.java:729)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Já fiz várias tentativas, mas nenhuma da certo…
Se alguém souber ficarei grato

5 Respostas

darlan_machado

Qual a relação entre produto e marca? E o que você quer buscar?

A

Produto tem uma marca
@ManyToOne

quero buscar a dsMarca(descrição da marca)

darlan_machado

Posta as entidades, cara.

A

Produto:

@Id
    @Column(updatable = false)
    @SequenceGenerator(name = "SEQPRODUTO", sequenceName = "SEQPRODUTO", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQPRODUTO")
    private Integer idProduto;
    
    private String dsProduto;
    
    private String tpProduto;
    
    private Double vlCusto = 0.0;
    
    private Double vlVenda = 0.0;
    
    private Integer qtd = 0;
    
    private String stProduto;
    
    private Integer nrCodeBarras = 0;
    
    private String tamanhoProduto;
    
    @ManyToOne
    @JoinColumn(name="idMarca")
    private Marca marca;

Marca:

@Id

@Column(nullable = false)

@SequenceGenerator(name = SEQMARCA, sequenceName = SEQMARCA, allocationSize = 1)

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQMARCA)

private Integer idMarca;
private String dsMarca;

private String origemMarca;

private String stMarca;

Controlador da classe produto:

[code…]

public List getProdutoPorID(int idProduto){

Session sessao = HibernateUtil.getSession();
    sessao.beginTransaction();
    try{
        return sessao.createQuery("from Produto where idProduto = "+idProduto+" order by idProduto").list();
    }catch (Exception e){
        mensagem = TrataException.trataException(e);
        return null;
    }finally{
        sessao.close();
    }
}

public List<Produto> getProdutoPorSituacao(String stProduto){
    String par = stProduto.toUpperCase();
    Session sessao = HibernateUtil.getSession();
    sessao.beginTransaction();
    try{
        return sessao.createQuery("from Produto where stProduto like '"+par+"' order by idProduto").list();
    }catch (Exception e){
        mensagem = TrataException.trataException(e);
        return null;
    }finally{
        sessao.close();
    }
}

public List<Produto> getProdutoPorMarca(String marca){
    String par = marca.toUpperCase();
    String sql = "from Produto prod left join Marca marc on marc.idMarca = prod.idMarca where marc.dsMarca like '%"+par+"%' order by idProduto";
    Session sessao = HibernateUtil.getSession();
    sessao.beginTransaction();
    try{
        return sessao.createSQLQuery(sql).list();
    }catch (HibernateException e){
        mensagem = TrataException.trataException(e);
        return null;
    }finally{
        sessao.close();
    }
}
darlan_machado

Você disse que quer buscar

Mas está fazendo isso a partir do produto?

Se for isso, eu faria algo assim

FROM Produto p WHERE p.id = :id

E, ao receber o objeto, devolveria:

produto.getMarca().getDsMarca();
Criado 11 de novembro de 2019
Ultima resposta 11 de nov. de 2019
Respostas 5
Participantes 2