16

以下のHQLを実行しており、正常に実行されています

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();

ここで、バックエンドで生成された sql をサポート ユーザーのログに記録したいと考えています。

QueryTranslator を利用したいのですが、対応する HQL の SQL を生成する方法を教えてください。これを実現する方法を教えてください。

4

7 に答える 7

7

休止状態の QueryTranslator を使用できます。

String hqlQueryString = hqlQuery.getQueryString();
ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
SessionImplementor hibernateSession = entityManager.unwrap(SessionImplementor.class);
QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, java.util.Collections.EMPTY_MAP, hibernateSession.getFactory());
queryTranslator.compile(java.util.Collections.EMPTY_MAP, false);
String sqlQueryString = queryTranslator.getSQLString();
于 2014-10-20T09:35:04.640 に答える
5

上位2つの回答の組み合わせが必要だと思います

  String hqlQueryString = query.unwrap(org.hibernate.Query.class).getQueryString();
  ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
  SessionImplementor hibernateSession = em.unwrap(SessionImplementor.class);
  QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, java.util.Collections.EMPTY_MAP, hibernateSession.getFactory());
  queryTranslator.compile(java.util.Collections.EMPTY_MAP, false);
  String sqlQueryString = queryTranslator.getSQLString();
于 2017-10-24T22:14:41.197 に答える
1

休止状態のタイプ

2.9.11 バージョン以降、Hibernate タイプオープンソース プロジェクトは、Hibernate SQLExtractor5.4、5.3、5.2、5.1、5.0 を使用していても、任意の JPQL または Criteria API クエリから SQL クエリを取得できるユーティリティを提供します。 4.3、4.2、または 4.1。

JPQL (HQL) クエリから SQL ステートメントを取得する

次の JPQL (HQL) クエリがあるとします。

Query jpql = entityManager.createQuery("""
    select 
       YEAR(p.createdOn) as year, 
       count(p) as postCount 
    from 
       Post p 
    group by 
       YEAR(p.createdOn)
    """, Tuple.class
);

Hibernate タイプを使用すると、Hibernate で生成された SQL クエリを抽出するのは次のように簡単です。

String sql = SQLExtractor.from(jpql);

そして、抽出された SQL クエリをログに記録すると、次のようになります。

LOGGER.info("""
    The JPQL query: [
        {}
    ]
    generates the following SQL query: [ 
        {}
    ]
    """,
    jpql.unwrap(org.hibernate.query.Query.class).getQueryString(),
    sql
);

次の出力が得られます。

- The JPQL query: [
    select    
        YEAR(p.createdOn) as year,    
        count(p) as postCount 
    from    
        Post p 
    group by    
        YEAR(p.createdOn)
]
generates the following SQL query: [
    SELECT 
        extract(YEAR FROM sqlextract0_.created_on) AS col_0_0_,
        count(sqlextract0_.id) AS col_1_0_
    FROM 
        post p
    GROUP BY 
        extract(YEAR FROM p.created_on)
]

関連する JPQL クエリ文字列をログに記録するために使用できるメソッドを提供Queryする Hibernateorg.hibernate.query.QueryインターフェースにJPQL (HQL) をアンラップしたことに注意してください。getQueryString

于 2020-06-02T14:40:05.713 に答える
-2

unwrap メソッドを使用してクエリを取得できます。

String queryString = query.unwrap(org.hibernate.Query.class).getQueryString();
于 2013-08-22T20:22:17.613 に答える