524 Stimmen

Wie drucke ich eine Abfragezeichenfolge mit Parameterwerten bei Verwendung von Hibernate?

Ist es in Hibernate möglich, generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen zu drucken?

Wie würden Sie vorschlagen, um Abfragen mit echten Werten zu drucken, wenn es nicht möglich ist, mit Hibernate API?

0voto

Andronicus Punkte 25065

hibernate-types verfügt über eine Utility-Methode zur Protokollierung von JPQL- und Kriterienabfragen. Weitere Details finden Sie in der Autorenbeschreibung Blogbeitrag . Hier ist ein Beispiel mit JPQL:

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

Le site sql hat den folgenden Wert:

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)

Sie kann unverändert in die DB-Konsole kopiert werden.

0voto

Cléssio Mendes Punkte 916

Die einfachste Lösung für mich ist die Implementierung einer regulären String-Ersetzung, um Parametereingaben durch Parameterwerte zu ersetzen (der Einfachheit halber werden alle Parameter als String behandelt):

String debuggedSql = sql;
// then, for each named parameter
debuggedSql = debuggedSql.replaceAll(":"+key, "'"+value.toString()+"'");
// and finally
System.out.println(debuggedSql);

Oder etwas Ähnliches für Positionsparameter (?).

Achten Sie auf Nullwerte und bestimmte Werttypen wie Datum, wenn Sie möchten, dass ein lauffähiges SQL protokolliert wird.

0voto

Aneesh Vijendran Punkte 3692

Utilice Wireshark oder etwas Ähnliches:

Keine der oben genannten Antworten druckt SQL mit Parametern richtig aus, oder es ist mühsam, es mit ihnen zum Laufen zu bringen. Ich erreichte dies durch die Verwendung von WireShark die alle SQL/Befehle erfasst, die von der Anwendung an Oracle/MySQL usw. mit den Abfragen gesendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X