0

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

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

或者有没有更好的方法在 Hibernate 中重新索引?

4

4 回答 4

1

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

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

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

这使您可以直接使用 aConnectionPreparedStatement/ 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 代码中处理函数的返回值,您可能会也可能不会。

于 2013-06-03T20:49:00.457 回答
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();
        }
    });
}

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

于 2013-06-03T21:28:00.893 回答
0

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

于 2013-06-03T20:13:13.033 回答
-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();
        }
    });
}
于 2017-12-11T08:52:55.760 回答