如何从 JPQLQuery 获取 SQL 字符串

发布于 2024-11-16 10:02:15 字数 371 浏览 3 评论 0原文

我正在使用 EclipseLink。

我有一个 JPQLquery,我想获取 sql 字符串.. 现在我正在这样做:

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

问题是在 sqlQueryString 中,常量被替换为 ?

我尝试获取导航表达式树的值(getSelectionCriteria()getHavingCriteria()),但通过这种方式我失去了类型

...有这样的问题吗?

I'm using EclipseLink.

I've a JPQLquery and I want to get the sql String..
Now I'm doing in this way:

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

The problem is that in the sqlQueryString the constant are replaced with ?

I've tried to get the values navigating the expressions trees (getSelectionCriteria() and getHavingCriteria()) but in this way I loose the type...

Do any one ever have a problem like this one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荒岛晴空 2024-11-23 10:02:15

引自 EclipseLink 常见问题解答

要查看 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);

Quoted from the EclipseLink FAQ:

To see the SQL for a JPA Query you can
enable logging on FINE or lower.

To get the SQL for a specific Query at
runtime you can use the DatabaseQuery
API.

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

This SQL will contain ? for
parameters. To get the SQL translated
with the arguments you need a
DatabaseRecord with the parameter
values.

Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
String sqlString = databaseQuery.getTranslatedSQLString(session, recordWithValues);
金橙橙 2024-11-23 10:02:15

这是一个有效的方法:

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);
    }

Here is a method that works:

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);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文