我正在努力建立一个每周五重新索引数据库的工作。我们正在使用hibernate,到目前为止我尝试的所有内容都失败了。有没有办法使用hibernate执行SQL管理命令?如:
Session session = helper.getSession();
session.createQuery("DBCCREINDEX(User)").executeUpdate();
还是有更好的方法在Hibernate中重新编制索引吗?
答案 0 :(得分:2)
下面引用的示例适用于Oracle PL / SQL,但从概念上讲,它与其他数据库相同。通过“构建一个作业”和“执行SQL管理命令”,我假设您将在数据库中存储某种需要调用的函数。
https://stackoverflow.com/a/2943733/131929有一个冗长的解释,但归结为
CallableStatement statement = session.connection().prepareCall(
"{ ? = call name_of_your_function(?) }");
允许您直接使用Connection
和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代码中处理函数的返回值,这可能是您的情况,也可能不是。
答案 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();
}
});
}