2012-05-29 31 views
1

我希望实现在JPA动态查询,像:如何使用连接编写动态JPA查询?

public Collection getOrderReportByUserName(String userName, Integer scripID, String orderStatus, String orderType) 
{  
    String strQuery = "Select o,t from OrderStock o,TradeStock t where o.userName.userName = "+ userName +" and t.userName.userName = "+ userName; 
    if(scripID > 0) 
    { 
     strQuery += " and o.scripID.scripID = " + scripID; 
    } 
    if(orderStatus != null) 
    {       
     if(orderStatus.equals("Executed")) 
     { 
      strQuery += " and o.OrderID = t.OrderID and o.OrderStatus = " + orderStatus; 
     } 
     else 
     { 
      if(scripID > 0 && orderType != null) 
      { 
       String sQuery = "Select o from OrderStock o where o.UserName = " + userName +" and o.ScripID = "+ scripID+" and o.BuySell = "+ orderType; 
       Collection<OrderStock> os = em.createQuery(sQuery).getResultList(); 
       Iterator it = os.iterator(); 
       Boolean ok = false; 
       while(it.hasNext()) 
       { 
        OrderStock osObj = (OrderStock)it.next(); 
        Integer pending = osObj.getPendingQuantity(); 
        Integer order = osObj.getOrderQuantity(); 
        if(pending > 0 && ((order-pending) != 0)) 
        { 
         ok = true; 
         break; 
        } 
       } 
       if(ok == true) 
       { 
        strQuery += " and o.OrderID = t.OrderID and o.OrderStatus = " + orderStatus; 
       } 
       else 
       { 
        strQuery += " and o.OrderStatus = " + orderStatus; 
       } 
      } 
     } 
    } 
    if(orderType != null) 
    { 
     strQuery += " and o.BuySell = " + orderType; 
    } 
    Collection c = em.createQuery(strQuery).getResultList(); 
    return c; 
} 

我希望的结果绑定到一个数据表,但你可以看到我想要返回一个集合由2个表 - orderStocktradeStock。那么如何在我的数据表中访问这个集合呢?我如何设置结果动态查询的参数?

回答

0

您尚未在您的代码中创建任何名称为tradeStock的变量,但我认为最后第3行的变量'c'是您的'tradeStock'。 所以如果你想从你的班级中返回2个列表,你应该创建一个新班级,说Stock。 股票将有2名成员名单,即tradeStockoverStock以及他们的获得者/设置者。 在此方法中,创建一个Stock的实例。当您从查询中提取resultList时,将其设置为Stock并从方法返回Stock

1
  • 要参数化您的查询,请参阅this article

  • 通过getOrderReportByUserName方法返回将包含对象的集合[2]元件。第一个元素将是OrderStock对象的实例,第二个元素将是TradeStock对象的实例。要坚持接收实体,您应该使用坚持合并方法实体管理器类。

  • 如果您使用的是JPA 2.0,则可以使用Criteria API来构造类型安全的查询。它可以比硬编码JPQL查询好得多。