我一直有这个我无法解决的便利问题。我的名为Plan
的表格不会被截断。
表实体如下所示:
@Entity
@Table(name = "`Plan`")
public class TablePlan {
...
}
在单元测试之间我需要截断这个表:
@After
public void resetDatabase(){
EntityManager em = objectRegistration.getEntityManager();
em.getTransaction().begin();
em.createNativeQuery("truncate table Plan").executeUpdate();
em.getTransaction().commit();
}
由于Plan
是MSSQL中的关键字,我需要围绕"计划"您可以在实体表名称中看到后引号。我目前只是使用hibernate来测试我的方法,这并不需要我围绕" Plan"使用后引号,但由于此代码适用于实际数据库,因此我不想更改它。
我也无法在任何地方更改任何名称,因为这是一个包含数百万条目的现有数据库。
我已经尝试过截断它:
em.createNativeQuery("truncate table `Plan`").executeUpdate();
但这似乎不起作用,经过一个小时的网络搜索而不知道究竟要搜索什么,我想让我们使用这个SO帐户进行更改!我已经调试了代码,我100%肯定截断更新查询根本不执行,因为它截断了一些不存在的表。因此我的计划"表格未被识别。
如果您需要更多信息,我会尝试在此处提供。
提前感谢您阅读此内容=)
***** SOLUTION *****
更改表名:
@Table(name = "\"Plan\"")
并更改截断查询:
em.createNativeQuery("truncate table \"Plan\"").executeUpdate();
Et瞧!
答案 0 :(得分:2)
后引号不是SQL Server中的转义字符。
在SQL Server中,不符合常规标识符规则(https://msdn.microsoft.com/en-us/library/ms175874.aspx)的表名必须括在方括号或双引号中。双引号是ANSI标准机箱。