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