2

GenericServiceを拡張するATGクラスを介して複数のレコードを更新しようとしています。しかし、私は障害物に逆らって走っています。キャッシュされたオブジェクトにすべてのアイテム/行を追加し続け、item.add()を使用してテーブルと単一のコマンド同期を実行できる複数の挿入クエリを実行するにはどうすればよいですか?

サンプルコード

最初の部分は、挿入が行われる前にテーブルの行をクリアすることです(ループして1つずつ削除することなく、テーブルのすべての行をクリアする方法を誰かが知っている場合に非常に役立ちます)。

    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) ;
        }
4

2 に答える 2

4

The way I interpret your question is that you want to add multiple repository items to your repository but you want to do it fairly efficiently at a database level. I suggest you make use of the Java Transaction API as recommended in the ATG documentation, like so:

TransactionManager tm = ...
TransactionDemarcation td = new TransactionDemarcation ();
try {
  try {
    td.begin (tm);

    ... do repository item work ...
  }
  finally {
    td.end ();
  }
}
catch (TransactionDemarcationException exc) {
  ... handle the exception ...
}

Assuming you are using a SQL repository in your example, the SQL INSERT statements will be issued after each call to addItem but will not be committed until/if the transaction completes successfully.

于 2012-08-17T12:05:02.840 に答える
0

ATG は、単一の SQL ステートメントで複数のレコードを削除することをサポートしていません。@chrisjleu が示唆するように、トランザクションを使用できますが、DELETE WHERE ID IN {"1", "2", ...}. あなたのコードは正しいようです。

ストアド プロシージャを呼び出したり、ATG リポジトリを介してカスタム SQL を実行したりすることは可能ですが、移植性やメンテナンスの理由から、一般的にはお勧めできません。その場合、アイテム/クエリ キャッシュの適切な部分を手動でフラッシュする必要もあります。

于 2012-11-28T16:46:15.960 に答える