从Hibernate调用DB函数

时间:2013-06-03 17:34:45

标签: java sql hibernate indexing hql

我正在努力建立一个每周五重新索引数据库的工作。我们正在使用hibernate,到目前为止我尝试的所有内容都失败了。有没有办法使用hibernate执行SQL管理命令?如:

    Session session = helper.getSession();
    session.createQuery("DBCCREINDEX(User)").executeUpdate();

还是有更好的方法在Hibernate中重新编制索引吗?

4 个答案:

答案 0 :(得分:2)

下面引用的示例适用于Oracle PL / SQL,但从概念上讲,它与其他数据库相同。通过“构建一个作业”和“执行SQL管理命令”,我假设您将在数据库中存储某种需要调用的函数。

https://stackoverflow.com/a/2943733/131929有一个冗长的解释,但归结为

CallableStatement statement = session.connection().prepareCall(
        "{ ? = call name_of_your_function(?) }");

允许您直接使用ConnectionPreparedStatement / CallableStatement

https://stackoverflow.com/a/1703398/131929基本相同,但它使用了Session#doWork

session.doWork(new Work() {
  public void execute(Connection connection) throws SQLException {
    CallableStatement call = connection.prepareCall("{ ? = call name_of_your_function(?) }");

请注意,在这两个示例中,都需要在Java代码中处理函数的返回值,这可能是您的情况,也可能不是。

答案 1 :(得分:0)

Session.createQuery()需要HQL查询。如果要执行SQL,请使用Session.createSQLQuery()

答案 2 :(得分:0)

我们最终解决了以下解决方案之后的许多错误。准备好的语句是在MSSQL SSMS中创建的重新索引的存储过程。

    private void reindex() {
        Session session = helper.getSession();
        PreparedStatement ps;
        session.doWork(new Work() {
        public void execute(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement("reindexTable");
            ps.execute();
        }
    });
}

这似乎已经给出了预期的结果并执行......但是我们现在必须解决超时问题。

答案 3 :(得分:-1)

试试这段代码 -

private void reindex() {
    Session session = helper.getSession();
    PreparedStatement ps;
        session.doWork(new Work() {
            public void execute(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement("reindexTable");
            ps.execute();
        }
    });
}