2015-07-21 50 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有一個方法,告訴你要引用什麼內容,以便您可以獨立於數據庫。 –