【问题标题】:How to get the SQL String From JPQLQuery如何从 JPQLQuery 获取 SQL 字符串
【发布时间】:2011-09-18 18:12:35
【问题描述】:

我正在使用 EclipseLink。

我有一个 JPQLquery,我想获取 sql 字符串。 现在我是这样做的:

EJBQueryImpl qi = (EJBQueryImpl)jpqlQuery;
String sqlQueryString = qi.getDatabaseQuery().getSQLString();

问题在于 sqlQueryString 中的常量被替换为 ?

我试图获取导航表达式树的值(getSelectionCriteria()getHavingCriteria()),但这样我就失去了类型......

有人遇到过这样的问题吗?

【问题讨论】:

  • 作为后续问题:当我执行 em.persist(pojoDbObject) 时如何获取 SQL 字符串?

标签: java sql jpa eclipselink jpql


【解决方案1】:

这是一个有效的方法:

public static void logJpaQuery(EntityManager em, TypedQuery tq){
        org.eclipse.persistence.sessions.Session session = em.unwrap(JpaEntityManager.class).getActiveSession();        
        DatabaseQuery dq = ((EJBQueryImpl) tq).getDatabaseQuery();
        AbstractRecord translationRow = dq.getTranslationRow();        
        dq.prepareCall(session, new DatabaseRecord());        
        String translatedSQLString = dq.getTranslatedSQLString(session, translationRow);
        log.trace("translated sql is: {}", translatedSQLString);
    }

【讨论】:

    【解决方案2】:

    引用自EclipseLink FAQ

    要查看 JPA 查询的 SQL,您可以 启用 FINE 或更低的日志记录。

    在以下位置获取特定查询的 SQL 运行时,您可以使用 DatabaseQuery API。

    Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
    DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
    databaseQuery.prepareCall(session, new DatabaseRecord());
    String sqlString = databaseQuery.getSQLString();
    

    此 SQL 将包含 ?为了 参数。翻译 SQL 有你需要的论据 带参数的数据库记录 价值观。

    Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
    DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
    String sqlString = databaseQuery.getTranslatedSQLString(session, recordWithValues);
    

    【讨论】:

    • 什么是recordWithValues?是否可以从 DatabaseQuery 或 EJBQueryImpl 中获取?
    • 供将来参考:recordWithValues 应为 databaseQuery.getTranslationRow()(来源:dzone.com/articles/eclipselink-how-get-sql
    猜你喜欢
    • 2017-04-14
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2021-04-15
    • 2016-11-23
    相关资源
    最近更新 更多