我希望在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个表组成的集合 - orderStock
和tradeStock
。那么如何在我的数据表中访问此集合?如何设置生成的动态查询的参数?
答案 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个成员列表,即tradeStock
和overStock
以及getter / setter。
在此方法中,创建Stock
的实例。当您从查询中获取resultList时,将其设置为Stock
并从方法返回Stock
。