2017-04-06 48 views
0

我在Hibernate/JPA世界还是个新手,我在这里试图用id来搜索同样的方法,但我试图搜索和使用两个参数从数据库返回字段,我也使用基本的CRUD操作加上这个特殊的操作为我的项目做了一个DAO方法。当时做搜索它给了我这个返回堆栈跟踪:在JPA中使用两个或更多参数进行搜索查询

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Provided id of the wrong type for class com.exemplo.model.Pedido. Expected: class java.lang.Long, got class java.sql.Date 
 
\t at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1135) 
 
\t at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1068) 
 
\t at com.exemplo.repositorio.MySQLPedidoDAO.pesquisarPorData(MySQLPedidoDAO.java:82) 
 
\t at com.exemplo.view.ViewPedidos.btBuscarActionPerformed(ViewPedidos.java:322) 
 
\t at com.exemplo.view.ViewPedidos.access$000(ViewPedidos.java:23) 
 
\t at com.exemplo.view.ViewPedidos$1.actionPerformed(ViewPedidos.java:106) 
 
\t at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
 
\t at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
 
\t at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
 
\t at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
 
\t at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
 
\t at java.awt.Component.processMouseEvent(Component.java:6533) 
 
\t at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
 
\t at java.awt.Component.processEvent(Component.java:6298) 
 
\t at java.awt.Container.processEvent(Container.java:2236) 
 
\t at java.awt.Component.dispatchEventImpl(Component.java:4889) 
 
\t at java.awt.Container.dispatchEventImpl(Container.java:2294) 
 
\t at java.awt.Component.dispatchEvent(Component.java:4711) 
 
\t at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
 
\t at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
 
\t at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
 
\t at java.awt.Container.dispatchEventImpl(Container.java:2280) 
 
\t at java.awt.Window.dispatchEventImpl(Window.java:2746) 
 
\t at java.awt.Component.dispatchEvent(Component.java:4711) 
 
\t at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
 
\t at java.awt.EventQueue.access$500(EventQueue.java:97) 
 
\t at java.awt.EventQueue$3.run(EventQueue.java:709) 
 
\t at java.awt.EventQueue$3.run(EventQueue.java:703) 
 
\t at java.security.AccessController.doPrivileged(Native Method) 
 
\t at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
 
\t at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
 
\t at java.awt.EventQueue$4.run(EventQueue.java:731) 
 
\t at java.awt.EventQueue$4.run(EventQueue.java:729) 
 
\t at java.security.AccessController.doPrivileged(Native Method) 
 
\t at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
 
\t at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
 
\t at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
 
\t at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
 
\t at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
 
\t at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
 
\t at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
 
\t at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
 
Caused by: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.exemplo.model.Pedido. Expected: class java.lang.Long, got class java.sql.Date 
 
\t at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:133) 
 
\t at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1066) 
 
\t at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176) 
 
\t at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2540) 
 
\t at org.hibernate.internal.SessionImpl.get(SessionImpl.java:951) 
 
\t at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1110) 
 
\t ... 41 more

我的方法是这样,DAO类:

public interface DAO <T, K> { 
 

 
    public void inserir(T o); 
 
    
 
    public void alterar(T o); 
 

 
    public void excluir(T o); 
 

 
    public T pesquisar(K id); 
 

 
    public List<T> listar(); 
 
    
 
}

PedidoDAO:

public interface PedidoDAO extends DAO <Pedido, Long> { 
 
    
 
    public Pedido pesquisarPorData(Date dataCadastro); 
 
    
 
}

MySQLPedidoDAO:(在PesquisarPorData功能错误)

public class MySQLPedidoDAO implements PedidoDAO { 
 

 
    public ConnectionFactory cf = null; 
 

 
    public MySQLPedidoDAO(ConnectionFactory cf) { 
 
     this.cf = cf; 
 
    } 
 
    
 
    @Override 
 
    public Pedido pesquisar(Long id) { 
 
     cf.createEm().getTransaction().begin(); 
 
     Pedido pedido = cf.createEm().find(Pedido.class, id); 
 
     cf.createEm().getTransaction().commit(); 
 
     //erro ao deletar pois o factory já está fechado 
 
     //emf.close(); 
 
     return pedido; 
 
    } 
 
    
 
    @Override 
 
    public Pedido pesquisarPorData(Date dataCadastro) { 
 
     cf.createEm().getTransaction().begin(); 
 
     // ERROR AT THE LINE UNDER!!!!! 
 
     Pedido pedido = cf.createEm().find(Pedido.class, dataCadastro); 
 
     cf.createEm().getTransaction().commit(); 
 
     //erro ao deletar pois o factory já está fechado 
 
     //emf.close(); 
 
     return pedido; 
 
    } 
 
    
 
}

ViewPedidos:

public class ViewPedidos extends javax.swing.JInternalFrame { 
 

 
    private MySQLPedidoDAO mspdao; 
 
    private Pedido ped; 
 
    private boolean editavel; 
 
    
 
    /* Getters e Setters from editavel and ped */ 
 
    
 
    private void btPesquisaActionPerformed(java.awt.event.ActionEvent evt) {           
 
     habilitarApenasOSeData(); 
 
     limparCampos(); 
 
     tfPedido.setEditable(true); 
 
     tfPedido.requestFocus(); 
 
     btBuscar.setEnabled(true); 
 
    } 
 
    
 
    
 
    
 
    private void btBuscarActionPerformed(java.awt.event.ActionEvent evt) {           
 
     ConnectionFactory cf = new ConnectionFactory(); 
 
     MySQLPedidoDAO mspdao = new MySQLPedidoDAO(cf); 
 
     Pedido ped = new Pedido(); 
 
     
 
     if(tfPedido.getText().length() == 0 && tfDataCad.getText().length() == 0){ 
 
      JOptionPane.showMessageDialog(rootPane, "Search not succeed, please fill the fields above", "Search", JOptionPane.INFORMATION_MESSAGE); 
 
     } else { 
 
      ped = mspdao.pesquisar(Long.parseLong(tfPedido.getText())); 
 
      ped = mspdao.pesquisarPorData(new java.sql.Date(((java.util.Date)tfDataCad.getValue()).getTime())); 
 
      setPed(ped); 
 
      setEditable(true); 
 
      carregarCampos(); 
 
      habilitarTextFieldEBotoes(); 
 
     } 
 
       
 
    } 
 
    
 
    
 
}

我测试过评论涉及日期字段的代码只让id被搜索,它运行得非常好,我试图做一个快速修复搜索通过id和注册日期做两个不同的方法如上,我试着做一个createQuery,没有继续,我想知道我在哪里做错了?或者使用两个或更多参数在JPA中创建搜索功能的任何提示? (Obs:我的代码是在葡萄牙语,因为这是一个巴西项目对不起或任何错误),并提前致谢!

回答

1

问题是EntityManager#find要求您为您的实体提供主键(这是一个Long)。如果您想使用其他字段进行查询,则需要使用createQuery

您尚未在您的问题中提供实体定义。然而,查询会是这样的:

TypedQuery<Pedido> query = cf.createEm().createQuery("id = :id and registerDate = :date", Pedido.class); 
query.setParameter("date", dataCadastro); 
query.setParameter("id", id); 
List<Pedido> results = query.getResultList(); 

如果你只期待一个结果,你可以调用query.getSingleResult()而不是getResultList()。如果没有单个结果,这将会抛出NonUniqueResultException

+0

所以,我试图做一些事情:“select * from order where id =?and registerDate ='?' “;在JDBC/MySQL中,我知道它会是这样的......在JPQL中,我不知道它是否像:cf.createEm()。createQuery(“从Pedido Pedido中选择pedido,其中id =?和registerDate =' ?');我试图做一个函数来通过两个参数搜索数据,从Pedido类型返回一个对象 –

+0

我修改了我的答案,告诉你如何创建你的查询后 –

+0

嘿亚历克斯! !我已经测试了代码,现在它工作了,我不知道这个方法的正确使用createQuery()和setParameter()非常感谢您的帮助! –

0

原因:org.hibernate.TypeMismatchException:为类com.exemplo.model.Pedido提供了错误类型的ID。预期:类java.lang.Long,得到类java.sql.Date

从异常report.this表面看看是如此清楚,异常告诉你,预计一个长类型,但你把一个日期类型而不是Long。

+0

在这种情况下,我相信searchEm()。find()只是通过他的主键返回对象...我想要做的是设置一个函数,可以做这样的查询,如:“从订单顺序选择顺序,其中id =?和registerDate ='?' “;我怎么能在JPA中做到这一点?提前致谢! –