1

我希望在 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. 那么如何在我的数据表中访问这个集合呢?以及如何设置生成的动态查询的参数?

4

2 回答 2

1
  • 要参数化您的查询,请参阅这篇文章

  • getOrderReportByUserName方法返回的集合将包含Object[2]元素。第一个元素是OrderStock对象的实例,第二个元素是 TradeStock 对象的实例。要持久化接收到的实体,您应该使用EntityManager类的持久化或合并方法。

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

于 2012-05-29T12:44:20.943 回答
0

您尚未在您tradeStock的代码中创建任何具有名称的变量,但我假设'c'最后一行第三行中的变量是您的'tradeStock'. 因此,如果您想从您的班级返回 2 个列表,您应该创建一个新班级 say Stock。Stock 将有 2 个成员列表,即它们的tradeStockoverStock和 getter/setter。在此方法中,创建Stock.when 您从查询中获取 resultList 的实例并将其设置并从方法Stock返回。Stock

于 2012-05-29T12:40:06.883 回答