HQLは別のクエリの結果セットを選択できますか?
例えば:
SELECT COUNT(*) FROM (SELECT * FROM Table)
SQLでそれを実行できますが、HQLで上記のようにしようとすると、構文エラー「予期しないトークン:(行1、列22付近...」が表示されます。
HQLは subqueries をサポートしますが、selectまたはwhere句でのみ発生します。提供する例は、HQLのストレートステートメントとして記述するのが最適です。例えば:
select count(*) from table t (where table is the entity name)
クエリに(select * from Table)
よりも複雑なステートメントが含まれる場合は、このロジックをビューに配置し、このビューに基づいてエンティティを作成することをお勧めします。
副選択をサポートするデータベースの場合、Hibernateはクエリ内のサブクエリをサポートします。サブクエリは括弧で囲む必要があります(多くの場合、SQL集計関数呼び出しによって)。相関サブクエリ(外部クエリのエイリアスを参照するサブクエリ)も許可されます。
例
from DomesticCat as cat
where cat.name not in (
select name.nickName from Name as name
)
クエリのビューを作成してから、そのためのモデルオブジェクトを作成しました。その後、そのためのHQLクエリを作成することは簡単でした。
ただし、私のアプリケーションには、他のアプリケーションが必要とする可能性のあるパフォーマンス要件がないため、問題を回避できます。
データベースでサポートされている場合でも、HQLのfrom
句でサブクエリを実行する方法はありません。クエリをstore procedure
としてSQLに入れ、HQLでプロシージャを呼び出すことでこの問題を解決しました。例えば:
プロシージャをSQLに挿入します。
DELIMITER $$
CREATE PROCEDURE `procedure_name`(
`arg_name` INT,
) BEGIN
your query here
END;
$$
DELIMITER ;
その後、hibernateを使用する場合は、Java以下のコードからこのプロシージャを呼び出します。
Query query = session.createSQLQuery("CALL procedure_name(:arg_name)");
query.setParameter("arg_name", args);
List list = query.list();
これがお役に立てば幸いです。
必要に応じてサブクエリを使用することはできません。 1つの方法は、次のように個別を使用することです。
SELECT COUNT(DISTINCT t.id) FROM table t INNER JOIN t.list l
WHERE t.status = 'ST1' AND l.status = 'ST2'"
内部結合を使用して、選択した繰り返しを表現しました