使用关键字作为名称

时间:2015-07-21 12:08:41

标签: java sql-server hibernate jpa junit

我一直有这个我无法解决的便利问题。我的名为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瞧!

1 个答案:

答案 0 :(得分:2)

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

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