2010-10-24 65 views
0

我在EJB3 有新的问题,JPA我的堆栈跟踪是:EJB3,JPA误差与多个结果从Query.getSingleResult()返回

Caused by: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult() 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.throwNonUniqueResultException(EJBQueryImpl.java:1207) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:722) 
     at com.DAO.CartDAO.checkUserID(CartDAO.java:47) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056) 
     at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128) 
     at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292) 
     at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615) 
     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 
     at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139) 
     at sun.reflect.GeneratedMethodAccessor206.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858) 
     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 
     at com.sun.ejb.co 

我创建一个命令按钮用于添加物品到购物车,我写了一种方法添加项目到数据库,我检查是否userid和itemid!= null,项目数量将增加到1,这意味着当我有userid 1添加itemid 1到购物车,我的方法将检查如果存在的话,商品数量会在购物车表中添加1个商品数量,我可以用一个商品来完成,但是如果我将更多商品添加到购物车中,则意味着我添加了商品id到购物车表格中,然后添加更多数量itemid 1进入db它抛出异常多于一个结果。 。 。 我知道它不能同时有两个实例,但我不知道如何解决它? 请帮我

我addTocart方法

public void addtoCart(Items item){ 
     this.items = item; 
     if(cartDAO.checkUserID(getMemberLoginController().getUser().getUserid()) != null && 
       cartDAO.checkItemid(items.getItemid()) != null){ 
       cart = cartDAO.checkUserID(getMemberLoginController().getUser().getUserid()); 
       int updateQuantity = cart.getCartQuantity() + 1; 
       cart.setCartQuantity(updateQuantity); 
       // chuyen so luong sang kieu du lieu big decimal 
       java.math.BigDecimal bigQuantity = new java.math.BigDecimal(String.valueOf(updateQuantity)); 
       // so tien cua san pham = so luong x don gia 
       BigDecimal updatePrice = items.getPrice().multiply(bigQuantity); 
       cart.setPrice(updatePrice); 
       cart = cartDAO.updateCart(cart); 

     }else if(cartDAO.checkUserID(getMemberLoginController().getUser().getUserid()) != null && 
       cartDAO.checkItemid(items.getItemid()) == null){ 
       cart = cartDAO.checkUserID(getMemberLoginController().getUser().getUserid()); 
       cartPk.setUserid(getMemberLoginController().getUser().getUserid()); 
       cartPk.setItemid(item.getItemid()); 
       cart.setCartPK(cartPk); 
       cart.setCartQuantity(1); 
       cart.setPrice(item.getPrice()); 
       cart = cartDAO.addCart(cart); 

     }else { 
       cartPk.setItemid(item.getItemid()); 
       cartPk.setUserid(getMemberLoginController().getUser().getUserid()); 
       cart.setCartPK(cartPk); 
       cart.setCartQuantity(1); 
       cart.setPrice(item.getPrice()); 
       cart = cartDAO.addCart(cart); 
     } 

    } 

我的select语句

@NamedQuery(name = "Cart.findByUserid", query = "SELECT c FROM Cart c WHERE c.cartPK.userid = :userid") 

我checkuseridMethod

public Cart checkUserID(int id){ 
     Cart cart = null; 
     try { 
      Query query = em.createNamedQuery("Cart.findByUserid"); 
      query.setParameter("userid", id); 
      return (Cart) query.getSingleResult(); 
     } catch (NoResultException e) { 
      return null; 
     } 
    } 

回答

8

嗯,好像你的数据库有此用户更多的车(如果您存储用户历史,这是一个合理的场景)

您可以确保数据库中只有一条记录(例如,在创建新购物车时删除旧购物车),或者在查询中使用Query.setMaxResults(1)或类似ORDER BY dateCreated

+0

非常感谢! :d – MYE 2010-10-24 18:42:59