我是ATG的新手,我没有做一些看似相当简单的事情。
我正在尝试通过订单号在数据库中获取订单。但是这个数字不是orderId所以我不能只使用OrderManager.loadOrder方法。
这是我到目前为止的代码:
Repository orderRepository = getOrderManager().getOrderTools().getOrderRepository();
RepositoryView view = orderRepository.getView("order");
RqlStatement statement = RqlStatement.parseRqlStatement("orderNumber EQUALS ?0");
Object params[] = { pOrderNumber };
RepositoryItem items[] = statement.executeQuery(view, params);
RepositoryItem order = null;
if( (items != null) && (items.length > 0) ) {
order = items[0];
}
//Now I want to convert this order of type "RepositoryItem" to an actual Order object
我可以通过获取存储库ID并从OrderManager调用loadOrder来实现这一点,但这似乎又回到了数据库并再次找到了我手中的内容。
是否有另一种方法可以从RepositoryItem对象中获取实际的Order对象?
答案 0 :(得分:1)
如果您只需要订单项本身的属性,那么您可以使用getPropertyValue
方法直接从RepositoryItem检索它们。如果您发现要使用OrderImpl
包装器及其相关的便捷方法,那么您应该按照建议通过Order
方法检索OrderManager.loadOrder()
个对象实例。虽然这将需要应用程序稍微更多的工作来构造Order
包装器,但它并不一定意味着针对订单表的另一个DB调用。假设您没有为订单商品禁用存储库缓存,那么ATG将在为您构建OrderImpl
包装器时利用已经缓存的订单存储库项。当您通过orderNumber对订单执行RQL查找时,此项将被缓存,因此将不会执行冗余的DB调用。
请注意,如果尚未缓存这些项目(例如付款组,送货组,商业项目等),则可能需要额外的数据库调用来检索相关的订单商品。
答案 1 :(得分:0)
这实际上取决于你想要做什么。
关于是从数据库还是从缓存加载项目的问题取决于您的存储库设置,以及延迟加载设置。有关此文档的文档可以在here找到。
如果您想更新订单,那么您应该使用OrderManager.loadOrder()
,因为这样可以确保订单正确更新,并允许您重新定价订单并更新构成订单的其他存储库项目,例如付款组和发货组(记得使用事务包装器来确保订单安全更新)。
如果您只是尝试读取值,那么使用存储库方式会更快。我建议创建一个表单处理程序引用的全局范围组件。一些事情(下面没有测试的代码):
OrderTools.properties文件:
$class=com.acme.commerce.order.OrderTools
$scope=global
orderRepository=/atg/commerce/order/OrderRepository
OrderTools类:
public class OrderTools extends GenericService
{
private RepositoryView orderView;
private RqlStatement orderStm;
private OrderRepository orderRepository;
private OrderManager orderManager;
public void doStartService() throws ServiceException
{
try
{
orderView = getOrderRepository().getView(CommerceConstants.ORDER);
orderStm = RqlStatement.parseRqlStatement("uniqueOrderId = ?0");
} catch (RepositoryException e)
{
throw new ServiceException(e);
}
}
protected RepositoryItem getOrderItem(final String uniqueOrderId) throws RepositoryException
{
Object params[] = new Object[1];
params[0] = uniqueOrderId;
RepositoryItem[] orderItems = orderStm.executeQuery(orderView, params);
if (orderItems != null)
{
return getOrderRepository().getItem(orderItems[0].getRepositoryId(), CommerceConstants.ORDER);
} else
{
return null;
}
}
/*
This method demonstrates how to load an order using the OrderManager.loadOrder() method.
The code includes some basic timing so that a performance comparison can be done with the loadOrderSubItemsRepositoryMethod()
*/
public void loadOrderUsingOrderManager(String orderId) {
long startTime = System.currentTimeMillis();
Order order = getOrderManager().loadOrder(orderId);
long orderLoadTime = System.currentTimeMillis();
//read your properties here ...
long totalTime = System.currentTimeMillis();
if(isLoggingDebug()) {
logDebug("The order load time was " + (orderLoadTime - startTime) + "ms");
logDebug("The time to read the list of properties was " + (totalTime - startTime) + "ms");
}
}
/*
This method shows how to get order items such as payment groups or shipping groups using the repository.
*/
public void loadOrderSubItemsRepositoryMethod(MutableRepositoryItem orderItem) {
long startTime = System.currentTimeMillis();
// Example of how to get the payment groups using the repository
MutableRepositoryItem paymentGroups = (List) orderItem.getPropertyValue("paymentGroups");
// Put code here to iterate through the list of items you want to read
// Examploe of how to get the shipping groups
MutableRepositoryItem shippingGroups = (List) orderItem.getPropertyValue("shippingGroups");
long totalTime = System.currentTimeMillis();
if(isLoggingDebug()) {
logDebug("The order load time was " + (orderLoadTime - startTime) + "ms");
logDebug("The time to read the list of properties was " + (totalTime - startTime) + "ms");
}
}
public MutableRepository getOrderRepository()
{
return orderRepository;
}
public void setOrderRepository(final MutableRepository orderRepository)
{
this.orderRepository = orderRepository;
}
public OrderManager getOrderManager()
{
return orderRepository;
}
public void setOrderRepository(final OrderManager orderManager)
{
this.orderManager = orderManager;
}
}
希望这有帮助。