Hibernate のプロも知らない? Criteria API で SQL を取得する裏技
Hibernate Criteria API から SQL を取得する方法
Hibernate Criteria API は、オブジェクト指向のクエリ API を提供し、HQL を書くことなくデータベースを操作できます。しかし、デバッグやパフォーマンス分析のために、生成される SQL を確認したい場合があります。
方法
以下の 3 つの方法で、Criteria API から SQL を取得できます。
getSession().getStatistics().getSqlStatements() を使用する
この方法は、セッション中に実行されたすべての SQL ステートメントを取得します。ただし、Criteria API 以外の方法で実行された SQL も含まれます。
// セッションを取得
Session session = sessionFactory.openSession();
// Criteria クエリを作成
Criteria criteria = session.createCriteria(Person.class);
// クエリを実行
criteria.list();
// 実行された SQL ステートメントを取得
List<String> sqlStatements = session.getStatistics().getSqlStatements();
// SQL ステートメントを出力
for (String sql : sqlStatements) {
System.out.println(sql);
}
Criteria.setFetchMode() を使用する
Criteria.setFetchMode()
メソッドを使用して、FETCH
モードを JOIN
に設定すると、Criteria クエリが実行される前に SQL を取得できます。
// Criteria クエリを作成
Criteria criteria = session.createCriteria(Person.class);
// フェッチモードを JOIN に設定
criteria.setFetchMode("addresses", FetchMode.JOIN);
// SQL を取得
String sql = criteria.toString();
// SQL を出力
System.out.println(sql);
HibernateQueryPlanCache を使用する
Hibernate 5.2 以降では、HibernateQueryPlanCache
クラスを使用して、Criteria クエリの SQL を取得できます。
// クエリキャッシュを取得
QueryPlanCache queryPlanCache = sessionFactory.getQueryPlanCache();
// Criteria クエリを作成
Criteria criteria = session.createCriteria(Person.class);
// クエリプランを取得
QueryPlan queryPlan = queryPlanCache.getHQLQueryPlan(criteria.toString());
// SQL を取得
String sql = queryPlan.getNativeSQL();
// SQL を出力
System.out.println(sql);
注意事項
- 上記の方法で取得できる SQL は、データベースの方言によって異なる場合があります。
- 生成される SQL は、最適化のために変更される場合があります。
package com.example.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Criteria;
import org.hibernate.criterion.Restrictions;
public class Main {
public static void main(String[] args) {
// セッションファクトリーを作成
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
// セッションを取得
Session session = sessionFactory.openSession();
// Criteria クエリを作成
Criteria criteria = session.createCriteria(Person.class);
// 名前で検索条件を設定
criteria.add(Restrictions.eq("name", "John Doe"));
// SQL を取得
String sql = criteria.toString();
// SQL を出力
System.out.println(sql);
// クエリを実行
criteria.list();
// セッションを閉じる
session.close();
}
}
class Person {
private int id;
private String name;
// ...
}
SELECT
*
FROM
Person
WHERE
name = ?
説明
ポイント
Criteria API
は、オブジェクト指向のクエリ API を提供します。criteria.toString()
メソッドを使用して、Criteria クエリから SQL を取得できます。
Hibernate は、実行された SQL をログに出力する機能があります。ログレベルを DEBUG
に設定すると、Criteria クエリによって生成された SQL を含むすべての SQL が出力されます。
JDBC トレースツールを使用する
JDBC トレースツールは、データベースとの通信を記録するツールです。JDBC トレースツールを使用すると、Criteria クエリによって実行された SQL を含むすべての SQL を記録できます。
java sql hibernate