如何使用连接编写动态JPA查询?

时间:2012-05-29 12:11:13

标签: java java-ee 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。那么如何在我的数据表中访问此集合?如何设置生成的动态查询的参数?

2 个答案:

答案 0 :(得分:1)

  • 有关参数设置的信息,请参阅this article

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

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

答案 1 :(得分:0)

你还没有在你的代码中创建任何名为tradeStock的变量,但我假设第3行的变量'c'是你的'tradeStock'。 因此,如果您要从班级返回2个列表,则应创建一个新的班级Stock。 股票将有2个成员列表,即tradeStockoverStock以及getter / setter。 在此方法中,创建Stock的实例。当您从查询中获取resultList时,将其设置为Stock并从方法返回Stock