当我的代码发出这样的调用时:
entityManager.find(Customer.class, customerID);
如何查看此调用的SQL查询?假设我无权访问数据库服务器来分析/监视调用,是否可以在IDE中记录或查看JPA调用发出的相应SQL查询?我要使用jTDS驱动程序反对SQL Server 2008 R2。
当我的代码发出这样的调用时:
entityManager.find(Customer.class, customerID);
如何查看此调用的SQL查询?假设我无权访问数据库服务器来分析/监视调用,是否可以在IDE中记录或查看JPA调用发出的相应SQL查询?我要使用jTDS驱动程序反对SQL Server 2008 R2。
Answers:
日志记录选项是特定于提供程序的。您需要知道使用哪种JPA实现。
休眠(请参阅此处):
<property name = "hibernate.show_sql" value = "true" />
EclipseLink(请参阅此处):
<property name="eclipselink.logging.level" value="FINE"/>
OpenJPA(请参阅此处):
<property name="openjpa.Log" value="DefaultLevel=WARN,Runtime=INFO,Tool=INFO,SQL=TRACE"/>
DataNucleus(请参阅此处):
将日志类别设置DataNucleus.Datastore.Native
为一个级别,例如DEBUG
。
如果您使用休眠和注销作为记录器,则可以使用以下内容(仅显示绑定而不显示结果):
<appender
name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
%msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>return message.toLowerCase().contains("org.hibernate.type") &&
logger.startsWith("returning");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
</appender>
org.hibernate.SQL = DEBUG打印查询
<logger name="org.hibernate.SQL">
<level value="DEBUG" />
</logger>
org.hibernate.type = TRACE打印绑定和通常的结果,这将通过自定义过滤器被抑制
<logger name="org.hibernate.type">
<level value="TRACE" />
</logger>
您需要janino依赖项(http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.6.1</version>
</dependency>
在EclipseLink中,在运行时获取特定查询的SQL时,可以使用DatabaseQuery API:
Query query = em.createNamedQuery("findMe");
Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
String sqlString = databaseQuery.getSQLString();
此SQL将包含?用于参数。要使用参数转换SQL,您需要一个带参数值的DatabaseRecord。
DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");
String sqlStringWithArgs =
databaseQuery.getTranslatedSQLString(session, recordWithValues);
来源:如何获取查询的SQL
为了查看OpenJPA中的所有SQL和参数,请将这两个参数放在persistence.xml中:
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
使用log4j(src \ log4j.xml)的示例:
<?xml version="1.0" encoding="UTF-8" ?>
<appender name="CA" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="512"/>
<appender-ref ref="CA_OUTPUT"/>
</appender>
<appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/>
</layout>
</appender>
<logger name="org.hibernate.SQL" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="CA"/>
</logger>
<root>
<level value="WARN"/>
<appender-ref ref="CA"/>
</root>
我制作了一份备忘单,我认为对其他人有用。在所有示例中,format_sql
如果要将记录的查询保持在一行上(无需打印),可以删除该属性。
无需标准语句即可打印漂亮的SQL查询,无需准备语句的参数,也无需优化日志记录框架:
application.properties
文件:
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
application.yml
文件:
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
漂亮的打印SQL查询与使用日志框架预处理语句的参数:
application.properties
文件:
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
application.yml
文件:
spring:
jpa:
properties:
hibernate:
format_sql: true
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
使用日志记录框架漂亮地打印SQL查询,而无需准备语句的参数:
application.properties
文件:
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
application.yml
文件:
spring:
jpa:
properties:
hibernate:
format_sql: true
logging:
level:
org:
hibernate:
SQL: DEBUG
来源(以及更多详细信息):https : //www.baeldung.com/sql-logging-spring-boot
如果您有太多的日志,并且只想将其作为临时日志,则可以选择另一个不错的选择System.out.println()
,具体取决于您的提供者:
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ExaminationType> criteriaQuery = criteriaBuilder.createQuery(getEntityClass());
/* For Hibernate */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.hibernate.Query.class).getQueryString());
/* For OpenJPA */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.apache.openjpa.persistence.QueryImpl.class).getQueryString());
/* For EclipseLink */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(JpaQuery.class).getSQLString());
如果您使用的是Spring框架。如下修改您的application.properties文件
#Logging JPA Queries, 1st line Log Query. 2nd line Log parameters of prepared statements
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#Logging JdbcTemplate Queries, 1st line Log Query. 2nd line Log parameters of prepared statements
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE
使用Spring Boot,只需在application.properties中添加spring.jpa.show-sql = true即可。这将显示查询,但没有实际参数(您会看到?而不是每个参数)。
在探索性开发过程中,为了将SQL调试日志记录集中在要检查的特定方法上,我用以下logger语句装饰了该方法:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.DEBUG);
entityManager.find(Customer.class, customerID);
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.INFO);
有一个名为persistence.xml的文件。按Ctrl + Shift + R并找到它,然后在某个地方编写了类似showSQL的内容。
只是说真的
我不确定服务器是否必须以调试模式启动。检查在控制台上创建的SQL。