例:ジャーナル記事の中間バージョンの削除
ここでは、ジャーナル記事の中間バージョンを削除する手順とコードサンプルを示します。 スクリプト コンソールでは、Java または Groovy コードを実行して、不要なオブジェクト バージョンを削除できます。
ジャーナル記事の中間バージョンを削除する手順の例を次に示します。
-
最新バージョンをいくつ保存するかを決定します。 元のバージョンと最新バージョンを保持する必要がありますが、追加の最新バージョンも保持できます。 たとえば、最新の 2 つのバージョンを保持したり、最新のバージョンのみを保持したりすることができます。
-
エンティティ バージョンを削除する方法を見つけます。
Liferay DXP App API と com.liferay.portal.kernel API が利用可能なオプションです。
If it's a [Service Builder](https://help.liferay.com/hc/en-us/articles/360030958811-Running-Service-Builder) entity, examine the `delete*` methods in the entity's `*LocalServiceUtil` class.
For example, this `deleteArticle` in `JournalArticleLocalServiceUtil` deletes a Journal Article version:
```java
deleteArticle(long groupId, java.lang.String articleId, double version,
java.lang.String articleURL,
com.liferay.portal.kernel.service.ServiceContext serviceContext)
```
-
削除するエンティティ バージョンと、それらを削除するために必要な情報を集約します。
たとえば、削除条件に一致する範囲内のすべての
JournalArticleバージョンを取得し、それらのエンティティ ID とグループ ID を関連付けます (上記のdeleteArticleメソッドでは、エンティティ ID とグループ ID が必要です)。エンティティオブジェクト(
JournalArticleなど)には通常、バージョンフィールドがあります。JournalArticleResourceには、各JournalArticleの記事ID(エンティティのID)とグループIDがあります。JournalArticleResourceは各JournalArticleを取得するための鍵で、複数のバージョンを持つことができます。 削除するJournalArticleバージョンを特定する手順は次のとおりです。すべての
JournalArticleResourceオブジェクトを取得します。List<JournalArticleResource> journalArticleResources = JournalArticleLocalServiceUtil.getJournalArticleResources(start, end);各
JournalArticleResourceに関連付けられたJournalArticleオブジェクトを介して、各JournalArticleバージョンのワークフローステータスを取得します。 動的クエリ は、各オブジェクトから必要なデータを正確に取得する効率的な方法です。for (JournalArticleResource journalArticeResource : journalArticleResources) { List<Double> journalArticlesVersionsToDelete = new ArrayList<Double>(); DynamicQuery dq = DynamicQueryFactoryUtil.forClass(JournalArticle.class) .setProjection(ProjectionFactoryUtil.projectionList() .add(ProjectionFactoryUtil.property("id")) .add(ProjectionFactoryUtil.property("version")) .add(ProjectionFactoryUtil.property("status"))) .add(PropertyFactoryUtil.forName("groupId") .eq(journalArticeResource.getGroupId())) .add(PropertyFactoryUtil.forName("articleId") .eq(journalArticeResource.getArticleId())) .addOrder(OrderFactoryUtil.asc("version")); List<Object[]> result = JournalArticleLocalServiceUtil.dynamicQuery(dq); // See the next step for the sample code that goes here }JournalArticleResourceごとに(JournalArticleエンティティごとに1つあります)、保持する最初のバージョンと最新バージョンの範囲内にあり、かつステータスが削除に適している中間バージョンのリストを作成します。 たとえば、承認済みまたは期限切れの中間記事バージョン (つまり、 WorkflowConstants.STATUS_APPROVED または WorkflowConstants.STATUS_EXPIRED) を削除するとします。MIN_NUMBER_FIRST_VERSIONS_KEPTおよびMIN_NUMBER_LATEST_VERSIONS_KEPT変数は、保持する最初の(最も古い)バージョンと最新の(最も新しい)バージョンの最小数と最大数をマークします。List<Double> journalArticlesVersionsToDelete = new ArrayList<Double>(); for (int i=0; i < result.size(); i++) { long id = (long) result.get(i)[0]; double version = (double) result.get(i)[1]; int status = (int) result.get(i)[2]; if ((status == WorkflowConstants.STATUS_APPROVED) || (status == WorkflowConstants.STATUS_EXPIRED) { if (i < MIN_NUMBER_FIRST_VERSIONS_KEPT) { continue; } if (i >= (result.size() - MIN_NUMBER_LATEST_VERSIONS_KEPT)) { continue; } journalArticlesVersionsToDelete.add(version); } } // See the next step for the sample code that goes here -
最後に、集計したバージョンに一致する各ジャーナル記事を削除します。
for (double version : journalArticlesVersionsToDelete) { { JournalArticleLocalServiceUtil.deleteArticle(journalArticeResource.getGroupId(), journalArticeResource.getArticleId(), journalArticlesVersionsToDelete(i), null, null); }
同様のコードを記述して、他のエンティティの中間バージョンを削除できます。 コードの準備ができたら、サンプルモジュールを使用するか、スクリプトコンソールを使用してスクリプトとして実行します。
削除する各オブジェクトのバージョン(およびその他の必要な情報)を印刷します。 削除をコミットする前に、オブジェクト削除呼び出しをコメントアウトし、テストとして削除するバージョンのプリントアウトを読み取ることもできます。