web-dev-qa-db-ja.com

HQLは別のクエリの結果セットを選択できますか?

HQLは別のクエリの結果セットを選択できますか?
例えば:

SELECT COUNT(*) FROM (SELECT * FROM Table)


SQLでそれを実行できますが、HQLで上記のようにしようとすると、構文エラー「予期しないトークン:(行1、列22付近...」が表示されます。

20
Red Bit

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
)
15
Kevin Bowersox

クエリのビューを作成してから、そのためのモデルオブジェクトを作成しました。その後、そのためのHQLクエリを作成することは簡単でした。

ただし、私のアプリケーションには、他のアプリケーションが必要とする可能性のあるパフォーマンス要件がないため、問題を回避できます。

0
Marvo

データベースでサポートされている場合でも、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();

これがお役に立てば幸いです。

0
shinxg

必要に応じてサブクエリを使用することはできません。 1つの方法は、次のように個別を使用することです。

SELECT COUNT(DISTINCT t.id) FROM table t INNER JOIN t.list l
     WHERE t.status = 'ST1' AND l.status = 'ST2'"

内部結合を使用して、選択した繰り返しを表現しました

0