HibernateマッピングXMLファイルに(以下のような)副選択クエリがあります。これの目的は、CriteriaAPIを介してさまざまな制限が追加される基本的なSQLクエリを設定することです。ページネーションをサポートして並べ替え、フィルタリング、検索できるデータを表示しているので、CriteriaAPIはこれに非常に役立ちます。
<class name="className" table="tableName">
<subselect>
select x.col1 AS ID,
c.col2 AS a
....
from table1 x,
table2 y
where x.id = y.id
....
....
</subselect>
<id name="ID" column="ID"/>
<property name="a" column="a"/>
...
...
</class>
そして、Javaコードは次のようなことを行うことで制限を追加します
基準c=sessionFactory.getCurrentSession()。createCriteria(tableName.class); c.add(Restrictions.allEq(m)); //ここで、mは列フィルターを含むハッシュマップです
ただし、基本クエリを宣言するためにsubselectを使用すると、MySQLのパフォーマンスが非常に低下するようです。Hibernateは、基本クエリを、制限が追加された外部クエリのFROM句にあるサブクエリに配置します。したがって、明確にするために、HibernateはAのようなクエリを作成しますが、必要なクエリはBです。つまり、パフォーマンスが低下するため、サブクエリは必要ありません。
A: select _tmp.* B: select t1.col1,
from ( t1.col2
select t1.col1, from table1 t1,
t1.col2 table2 t2
from table1 t1, where t1.id = t2.id
table2 t2 and t1.col1 = 'blah'
where t1.id = t2.id order by t1.col desc
...
) _tmp
where _tmp.col1 = 'blah'
order by _tmp.col2 desc
だから私の質問は、Criteria APIを使用できるようにする副選択を使用せずにHibernateで基本的なクエリを作成するにはどうすればよいですか?クエリAではなくクエリBを実行するHibernateを取得するための最良の方法は何ですか?
マッピングファイルに名前付きクエリを作成して読み込むことができることは理解していますが、クエリを読み込むと、特定の制限を追加できますが、並べ替えなどのオプションが許可されないため、Criteriaほど良くありません。 ..
したがって、どちらかを使用する以外に他のオプションはありますか
<hibernate-mapping>
<class name="" table="">
<subselect></subselect>
</class>
</hibernate-mapping>
or
<hibernate-mapping>
<sql-query name="">
<return-scalar column="col" type="string"/>
</sql-query>
</hibernate-mapping>
最初のオプションはサブクエリの使用によってパフォーマンスを低下させ、2番目のオプションは(とにかく私の知る限りでは?)CriteriaAPIを使用することを許可しないためです。