カスタムSQLクエリの使用
Service Builder は、エンティティの属性 (列の値) を取得するファインダー メソッドを作成します。 service.xml ファイルにファインダーのパラメーターとして列を追加し、Service Builder を実行すると、永続化レイヤーにファインダー メソッドが生成され、ファインダーを呼び出すメソッドがサービス レイヤーに追加されます。 クエリが十分に単純な場合は、動的クエリを使用して Liferay のデータベースにアクセスできます。 もっと複雑なこと(JOIN など)を実行したい場合は、独自のカスタム SQL クエリを作成できます。
カスタム サービスにはカスタム SQL をお勧めします。 すぐに使用できるLiferayエンティティをクエリするには、 DynamicQuery または DSLQueryを使用します。
サンプルをデプロイする
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、次の手順に従って例をデプロイします。
-
liferay-p9z0.zipサンプル プロジェクトをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/liferay-p9z0.zip -Ounzip liferay-p9z0.zip -
プロジェクトモジュールをビルドしてデプロイします。
cd liferay-p9z0./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.liferay.p9z0.web_1.0.0 [1386] STARTED com.liferay.p9z0.api_1.0.0 [1384] STARTED com.liferay.p9z0.service_1.0.0 [1385] -
サンプル モジュールが動作していることを確認するには、ブラウザーを開いて
https://localhost:8080にアクセスします。 -
P9Z0 ポートレットをページに追加します。 サンプル ポートレットは、ウィジェットのサンプルの下にあります。

-
名前と説明を入力してエントリを追加します。 非表示 のチェックを外のままにします。 追加をクリックすると、新しいエントリが P9Z0 エントリの下に表示されます。
-
別の名前と説明を持つ別のエントリを追加します。 今回は、 非表示をチェックします。 新しいエントリが P9Z0 エントリの下に表示されません。
この例では、カスタム SQL を使用して、データベース内の指定された値を持つエントリのみを取得します (hidden_ = false)。
コードにカスタムSQLを追加する
P9Z0EntryLocalServiceImpl.javaを開きます。 カスタム SQL リクエストのコードは、getEntriesメソッドで定義されています。
@Override
public List<P9Z0Entry> getP9Z0Entries(boolean hidden) {
Session session = null;
try {
session = p9z0EntryPersistence.openSession();
String sql = "select * from P9Z0_P9Z0Entry where hidden_ = ?";
SQLQuery sqlQuery = session.createSynchronizedSQLQuery(sql);
sqlQuery.addEntity("P9Z0_P9Z0Entry", P9Z0EntryImpl.class);
QueryPos queryPos = QueryPos.getInstance(sqlQuery);
queryPos.add(hidden);
return (List<P9Z0Entry>)QueryUtil.list(
sqlQuery, p9z0EntryPersistence.getDialect(), QueryUtil.ALL_POS,
QueryUtil.ALL_POS);
}
catch (Exception exception) {
throw new SystemException(exception);
}
finally {
p9z0EntryPersistence.closeSession(session);
}
}
- SQL クエリを文字列に保存し、変数値を
?に置き換えます。。
String sql = "select * from P9Z0_P9Z0Entry where hidden_ = ?";
SQLQueryオブジェクトを作成します。 Liferay はこのオブジェクトを使用して SQL クエリを処理します。 セッションでは、クラスター環境での問題を回避するためにSQLQueryオブジェクトが作成されます。 クエリが返すオブジェクトのクラスを定義するには、addEntityメソッドを使用します。
SQLQuery sqlQuery = session.createSynchronizedSQLQuery(sql);
sqlQuery.addEntity("P9Z0_P9Z0Entry", P9Z0EntryImpl.class);
を使用した場合?文字列内のプレースホルダーを使用して、SQLQueryからQueryPosオブジェクトを作成します。 置換する値を文字列に現れる順序で追加します。 この例では 1 つだけ使用します。
QueryPos queryPos = QueryPos.getInstance(sqlQuery);
queryPos.add(hidden);
QueryUtilはデータベース内でクエリを実行します。listメソッドは、GET呼び出しを行うために使用され、応答内の値のリストを返します。
return (List<P9Z0Entry>)QueryUtil.list(
sqlQuery, p9z0EntryPersistence.getDialect(), QueryUtil.ALL_POS,
QueryUtil.ALL_POS);