如何将RepositoryItem转换为ATG上的Order

时间:2014-08-01 18:05:42

标签: java atg

我是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对象?

2 个答案:

答案 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;
}

}

希望这有帮助。