我正在尝试建立一个每周五重新索引我们的数据库的工作。我们正在使用休眠,到目前为止我尝试过的一切都失败了。有没有办法使用休眠执行 SQL 管理命令?如:
    Session session = helper.getSession();
    session.createQuery("DBCCREINDEX(User)").executeUpdate();
或者有没有更好的方法在 Hibernate 中重新索引?
下面引用的示例适用于 Oracle PL/SQL,但在概念上它与其他数据库相同。通过“构建作业”和“执行 SQL 管理命令”,我假设您将在需要调用的数据库中存储某种函数。
https://stackoverflow.com/a/2943733/131929有一个冗长的解释,但归结为
CallableStatement statement = session.connection().prepareCall(
        "{ ? = call name_of_your_function(?) }");
这使您可以直接使用 aConnection和PreparedStatement/ 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 代码中处理函数的返回值,您可能会也可能不会。
在出现以下解决方案的许多错误之后,我们最终以自己的方式工作。准备好的语句是在 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();
        }
    });
}
这似乎已经给出了预期的结果并执行了......但是我们现在只需要解决超时问题。
Session.createQuery()需要一个 HQL 查询。如果要执行 SQL,请使用Session.createSQLQuery().
试试这个代码 -
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();
        }
    });
}