Advanced Queries
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

カスタム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に変更します。

次に、次の手順に従って例をデプロイします。

  1. liferay-p9z0.zip サンプル プロジェクトをダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-p9z0.zip -O
    
    unzip liferay-p9z0.zip
    
  2. プロジェクトモジュールをビルドしてデプロイします。

    cd liferay-p9z0
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    このコマンドは、デプロイされたjarをDockerコンテナ上の /opt/liferay/osgi/modules にコピーするのと同じです。

  3. 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]
    
  4. サンプル モジュールが動作していることを確認するには、ブラウザーを開いて https://localhost:8080にアクセスします。

  5. P9Z0 ポートレットをページに追加します。 サンプル ポートレットは、ウィジェットのサンプルの下にあります。

    P9Z0 ポートレットをページに追加します。

  6. 名前と説明を入力してエントリを追加します。 非表示 のチェックを外のままにします。 追加をクリックすると、新しいエントリが P9Z0 エントリの下に表示されます。

  7. 別の名前と説明を持つ別のエントリを追加します。 今回は、 非表示をチェックします。 新しいエントリが P9Z0 エントリの下に表示されません。

この例では、カスタム SQL を使用して、データベース内の指定された値を持つエントリのみを取得します (hidden_ = false)。

コードにカスタムSQLを追加する

  1. 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);
	}
}
  1. SQL クエリを文字列に保存し、変数値を ?に置き換えます。。
String sql = "select * from P9Z0_P9Z0Entry where hidden_ = ?";
  1. SQLQuery オブジェクトを作成します。 Liferay はこのオブジェクトを使用して SQL クエリを処理します。 セッションでは、クラスター環境での問題を回避するために SQLQuery オブジェクトが作成されます。 クエリが返すオブジェクトのクラスを定義するには、 addEntity メソッドを使用します。
SQLQuery sqlQuery = session.createSynchronizedSQLQuery(sql);

sqlQuery.addEntity("P9Z0_P9Z0Entry", P9Z0EntryImpl.class);
  1. を使用した場合? 文字列内のプレースホルダーを使用して、 SQLQueryから QueryPos オブジェクトを作成します。 置換する値を文字列に現れる順序で追加します。 この例では 1 つだけ使用します。
QueryPos queryPos = QueryPos.getInstance(sqlQuery);

queryPos.add(hidden);
  1. QueryUtil はデータベース内でクエリを実行します。 list メソッドは、 GET 呼び出しを行うために使用され、応答内の値のリストを返します。
return (List<P9Z0Entry>)QueryUtil.list(
	sqlQuery, p9z0EntryPersistence.getDialect(), QueryUtil.ALL_POS,
	QueryUtil.ALL_POS);