2015-07-21 25 views
0

我一直有这个方便的问题,我似乎无法解决。我的表名为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来测试我的方法,这不需要我用“引号”来包围反引号,但是因为这段代码是针对实际的数据库的,所以我不想改变它。

我也无法在任何地方更改任何名称,因为这是一个有数以万计条目的现有数据库。

我已经尝试截断它是这样的:

em.createNativeQuery("truncate table `Plan`").executeUpdate(); 

但是,这似乎并没有工作,在网上搜索,不知道究竟要搜索什么样的一个小时后,我想通让我们所以用这个考虑改变!我已经将代码调试到100%确定的地步,truncate update query根本不执行,因为它截断了一些不存在的表。因此我的“计划”表不被识别。

如果您需要更多信息,我会尽力在此提供。

预先感谢您阅读本=)

***** SOLUTION *****

更改表名称:

@Table(name = "\"Plan\"") 

并更改截断查询:

em.createNativeQuery("truncate table \"Plan\"").executeUpdate(); 

等瞧!

回答

2

反引号不是SQL Server中的转义字符。

在SQL Server中,不符合常规标识符规则(https://msdn.microsoft.com/en-us/library/ms175874.aspx)的表名必须括在方括号或双引号中。双引号是ANSI标准外壳。

+0

你是对的。我只加了后面的引号,因为我被告知在别的地方这会解决我的sql问题。现在使用双引号,单元测试再次运行。仍然需要测试我的mssql服务器,是否仍然有效=) –

+0

也适用于mssql,谢谢!将在问题中更新我的代码 –

+0

FWIW JDBC DatabaseMetadata有一个方法,告诉你要引用什么内容,以便您可以独立于数据库。 –