如何为单个方法设置show_sql Hibernate参数?

时间:2012-07-24 09:18:49

标签: java hibernate

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

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

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

但它将打印所有hibernate调用的所有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 个答案:

答案 0 :(得分:3)

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

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

... do your stuff ...

sqlLogger.setLevel(Level.OFF);

答案 1 :(得分: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) {
        }

用于生产环境非常危险。

答案 2 :(得分:0)

这样做的一种方法是将所有其他软件包/类的日志记录级别更改为更高级别,并仅将日志记录保持为此类/软件包的调试级别。

检查如何设置log4j属性。我确信必须有其他方法来做到这一点..

答案 3 :(得分:0)

使用hibernate属性或使用标准的hibernate / slf4j API调用无法做到这一点。

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