2

我想在 hibernate 方法的 java 代码中设置 show_sql hibernate 参数,以便它可以仅打印该特定方法的实际 SQL 查询。

我知道使用以下配置可以完成

<property name="show_sql">true</property>

但它会打印所有休眠调用的所有 sql。我想要一些特定的方法,例如。

public List<Customer> getAllCustomerListByActive(boolean isActive) {
        List<Customer> customerList = new ArrayList<Customer>();
        Criteria criteria = getSession().createCriteria(Customer.class);
        criteria.add(Restrictions.eq("isActive", isActive));
        criteria.add(Restrictions.eq("delFlag", false));
        criteria.addOrder(Order.asc("id"));
        customerList = criteria.list();        
        **//Print SQL Method Syntax will come here**
        return customerList;
    }
4

4 回答 4

3

您可以通过以下代码启用或禁用 SQL 日志记录。

Logger sqlLogger = Logger.getLogger("org.hibernate.SQL");
sqlLogger.setLevel(Level.DEBUG);

... do your stuff ...

sqlLogger.setLevel(Level.OFF);
于 2012-07-24T10:08:39.977 回答
1

@Vash 在上面给出了链接,其中详细介绍了不同的方法。

但是对于这个问题的参考,我在我的代码中使用的如下

try {
            CriteriaImpl c = (CriteriaImpl) criteria;
            SessionImpl s = (SessionImpl) c.getSession();
            SessionFactoryImplementor factory = (SessionFactoryImplementor) s.getSessionFactory();
            String[] implementors = factory.getImplementors(c.getEntityOrClassName());
            CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable) factory.getEntityPersister(implementors[0]),
                    factory, c, implementors[0], s.getEnabledFilters());
            Field f = OuterJoinLoader.class.getDeclaredField("sql");
            f.setAccessible(true);
            String sql = (String) f.get(loader);
        } catch (Exception e) {
        }

用于生产环境非常危险。

于 2012-07-24T09:46:57.597 回答
0

执行此操作的一种方法是将所有其他包/类的日志记录级别更改为更高级别,并将日志记录保持为仅针对此类/包的调试级别。

检查如何设置 log4j 属性。我相信一定有其他方法可以做到这一点..

于 2012-07-24T09:41:24.517 回答
0

这不能通过 hibernate 属性或使用标准 hibernate/slf4j API 调用来完成。

您可以尝试编写自己的自定义 Logger 来过滤掉不必要的输出。

于 2012-07-24T09:55:52.827 回答