2012-05-24 35 views
7

我想在Hibernate中使用@Where註釋來移除已被該對象的布爾屬性標記爲「已刪除」的對象。例如,下面的應該防止任何刪除地址從休眠加載:有沒有辦法阻止Hibernate破壞@Where註解中的布爾文字?

@OneToMany(mappedBy="contact") 
@Where(clause="deleted=FALSE") 
private Set<Address> addresses; 

然而,當我使用像deleted=FALSE的條款,則Hibernate會用一個表名,這會導致查詢加前綴,它裂傷的布爾值失敗。例如:

select ... from address address0_ where (address0_.deleted=address0_.FALSE) and address0_.contact_id=? 

我的預期是什麼樣的東西,而不是(address0_.deleted=FALSE)(address0_.deleted=address0_.FALSE)

有沒有辦法指定@Where子句或配置Hibernate來正確輸出布爾值?


PS。注意,有可能與一些數據庫指定布爾值作爲字符串文字是這樣的:

@Where(clause="deleted='FALSE'") 

,將得到轉化爲(address0_.deleted='FALSE')這工作就好了,例如,PostgreSQL的。不過,我在這個項目中使用HSQLDB,並且HSQLDB似乎不支持布爾字符串文字。在HSQL我使用deleted='FALSE'當出現以下情況例外:

org.hsqldb.HsqlException: data exception: invalid character value for cast

+0

您是否記得在休眠設置中指定HSQLDB Dialect? – Affe

+0

是的,我正在使用'org.hibernate.dialect.HSQLDialect',並且我已經仔細檢查過Hibernate是否真的在使用它。 – gutch

回答

5

我發現這個已沒有解決六年多的bug報告! Hibernate問題跟蹤器有問題HHH-1587HHH-2775ANN-647

解決方案是創建一個自定義Dialect類,其中註冊true,falseunknown作爲關鍵字(這些是SQL規範中的官方布爾文字)。這導致Hibernate將它們識別爲關鍵字,從而停止將它們作爲列的前綴。

這裏是我的自定義方言類,它解決了這個問題對我來說:

public class ImprovedHSQLDialect extends HSQLDialect { 

    public ImprovedHSQLDialect() { 
     super(); 
     registerKeyword("true"); 
     registerKeyword("false"); 
     registerKeyword("unknown"); 
    } 
} 

一旦這種方言在使用中,@Where(clause="deleted=FALSE")正常工作。

1

當列布爾表中確定指標創建,最新的HSQLDB支持WHERE active = TRUEWHERE active = 'TRUE'以及WHERE active

休眠可能會創建一個BIT列,在這種情況下WHERE active = TRUE,WHERE active = B'1'WHERE active = 1將工作。

對於這些功能,請使用版本2.2.8或更高版本。

+0

你確定嗎?我的問題中描述的錯誤發生在最新的HSQLDB(版本2.2.8)上。目前的文檔沒有提及http://hsqldb.org/doc/guide/sqlgeneral-chapt.html中對字符串布爾轉換的支持,所以我不相信這是HSQLDB的一個特性。 – gutch

+0

文檔無法涵蓋所有​​可能的轉化。如果表中有一個BOOLEAN列,那麼上述所有工作。 Hibernate必須創建一個BIT列,在這種情況下,WHERE active = TRUE,WHERE active = B'1'或WHERE active = 1將起作用。 – fredt

+0

在這種情況下,可能在'@ Column'註釋中指定適當的'columnDefinition'可能會使其工作。但就我而言,Hibernate將'FALSE'這樣的保留字當作列名是錯誤的,所以我認爲使用'registerKeyword'方法是一個更好的解決方案,正如我在我的答案中所描述的那樣 - 它很簡單,很快修復它在所有Hibernate對象中。 – gutch

相關問題