【问题标题】:ATG Repository APIATG 存储库 API
【发布时间】:2025-12-11 02:40:01
【问题描述】:

我试图通过扩展 GenericService 的 ATG 类更新多条记录。 但是我遇到了障碍。 如何进行多次插入查询,我可以继续将所有项目/行添加到缓存对象中,然后使用 item.add() 与表进行单个命令同步?

示例代码

第一部分是在插入发生之前清除表中的行(如果有人知道清除表中所有行而不必逐个循环并删除的方法,这将很有帮助)。

    MutableRepository repo = (MutableRepository) feedRepository;
    RepositoryView view = null; 

    try{
        view = getFeedRepository().getView(getFeedRepositoryFeedDataDescriptorName());
        RepositoryItem[] items = null;
        if(view != null){        
            QueryBuilder qb = view.getQueryBuilder();
            Query getFeedsQuery = qb.createUnconstrainedQuery();
            items = view.executeQuery(getFeedsQuery);
        }
        if(items != null && items.length>0){
            // remove all items in the repository
            for(RepositoryItem item :items){
                repo.removeItem(item.getRepositoryId(), getFeedRepositoryFeedDataDescriptorName());
            }
        }



        for(RSSFeedObject rfo : feedEntries){
            MutableRepositoryItem feedItem = repo.createItem(getFeedRepositoryFeedDataDescriptorName());

            feedItem.setPropertyValue(DB_COL_AUTHOR, rfo.getAuthor());
            feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getFeedUrl());
            feedItem.setPropertyValue(DB_COL_TITLE, rfo.getTitle());
            feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getPublishedDate());

            RepositoryItem item = repo.addItem(feedItem) ;
        }

【问题讨论】:

    标签: java repository atg


    【解决方案1】:

    ATG 不支持在单个 SQL 语句中删除多条记录。正如@chrisjleu 建议的那样,您可以使用事务,但没有办法做到与DELETE WHERE ID IN {"1", "2", ...} 等效。您的代码看起来正确。

    可以通过 ATG 存储库调用存储过程或执行自定义 SQL,但出于可移植性/维护原因,通常不建议这样做。如果这样做,您还需要手动刷新项目/查询缓存的适当部分。

    【讨论】:

      【解决方案2】:

      我解释您的问题的方式是您希望将多个存储库项目添加到您的存储库,但您希望在数据库级别相当有效地执行此操作。我建议你使用Java Transaction API as recommended in the ATG documentation,像这样:

      TransactionManager tm = ...
      TransactionDemarcation td = new TransactionDemarcation ();
      try {
        try {
          td.begin (tm);
      
          ... do repository item work ...
        }
        finally {
          td.end ();
        }
      }
      catch (TransactionDemarcationException exc) {
        ... handle the exception ...
      }
      

      假设您在示例中使用 SQL 存储库,SQL INSERT 语句将在每次调用 addItem 后发出,但直到/如果事务成功完成时才会提交。

      【讨论】: