JPA: how do you get/print the JPQL query string be

2019-04-27 07:32发布

问题:

How do you get/print the JPQL query string behind a (typed) query, that is after parameters have been set? (e.g. for debugging purposes)

A simple toString() doesn't seem to do the trick...

Thanks

回答1:

There is no such thing as "the final JPQL that ultimately gets translated to the final SQL". How a JPA implementation generates the SQL is down to it, and parameters in general will never be substituted into any String. SQL is generated from expression trees etc not a String. If you want param values inserting in then do it yourself since it only makes sense to you



回答2:

I know this is old, but the current answer doesn't exactly answer the original/root question.

I believe Kawu was looking for what the JPQL string looked like, not if it gets converted to SQL or not. The desire was the find the concrete parameter.

Anyway Kawu, I was looking for the same thing at one time because my query results were skewed and I couldn't tell what the parameter was. I found that adding the below code to the persistence.xml did the trick. I use EclipseLink, but I am sure other JPA implementaitons have something like this:

<property name="eclipselink.logging.level" value="FINE"/>

This shows the below in your server logs:

[EL Fine]: sql: 2016-10-24 16:02:08.577--ServerSession(13483501)--Connection(6214343)--Thread(Thread[27010968@qtp-10395070-0,5,main])--SELECT ID, Name FROM Test WHERE (ID = ?)
    bind => [<your parameter shows here>]


回答3:

For JBoss users: make the change in standalone.xml. In that file you will find a logging section under <profile>, eg:

    <subsystem xmlns="urn:jboss:domain:logging:3.0">
        <console-handler name="CONSOLE">
            <level name="INFO"/>
            <formatter>
                <named-formatter name="COLOR-PATTERN"/>
            </formatter>
        </console-handler>
        <logger category="com.arjuna">
            <level name="WARN"/>
        </logger>
        <logger category="org.jboss.as.config">
            <level name="DEBUG"/>
        </logger>
        <logger category="sun.rmi">
            <level name="WARN"/>
        </logger>
        <root-logger>
            <level name="INFO"/>
            <handlers>
                <handler name="CONSOLE"/>
            </handlers>
        </root-logger>
        <formatter name="PATTERN">

Default level is INFO. To get queries etc. to be shown, change the level to DEBUG in two places, as in:

    <subsystem xmlns="urn:jboss:domain:logging:3.0">
        <console-handler name="CONSOLE">
            <level name="DEBUG"/>
            <formatter>
                <named-formatter name="COLOR-PATTERN"/>
            </formatter>
        </console-handler>
        <logger category="com.arjuna">
            <level name="WARN"/>
        </logger>
        <logger category="org.jboss.as.config">
            <level name="DEBUG"/>
        </logger>
        <logger category="sun.rmi">
            <level name="WARN"/>
        </logger>
        <root-logger>
            <level name="DEBUG"/>
            <handlers>
                <handler name="CONSOLE"/>
            </handlers>
        </root-logger>
        <formatter name="PATTERN">

Re-start JBoss and now your console is filled with chatter.