用Hibernate查詢有下劃線的表字段遇到的問題

正在用Seam+Spring+Hibernate開發一個物流相關的項目,下午QA發現了一個這樣的問題:
當用某些字段作爲條件查找的時候,會出錯。後來經過查看Hibernate的log日誌,發現Hibernate產生的Sql語句中凡是有下劃線的都沒有正確解析到:比如:

Entity Class Snippet:
private Float ctnnweight;
private Float ctngweight;

private Integer quantityPerCtn;
.............................
@Column(name = "quantity_per_ctn")
public Integer getQuantityPerCtn() {
return quantityPerCtn;
}

Action Class Snippet:
models = this.shippingDatabase
.createQuery(
"select distinct m from Model m left outer join m.agiles agile order by m.name asc")
.setMaxResults(pageSize).setFirstResult(page * pageSize).list();

..................................
..................................
if (!bUnw) {
sql.append(" and unitnweight=:unitnweight");
}
if (!bUgw) {
sql.append(" and unitgweight=:unitgweight");
}

if (!bQpre) {
sql.append(" and quantityPerCtn=:quantityPerCtn");
}

Table Structure:
id: varchar(255)
unitnweight: int
unitgweight: int
quantity_per_ctn: int

如果用unitnweight或unitgweight作爲查詢條件的或,沒有問題。但是如果用quantityPerCtn的話,就會出現問題了。查看Hibernate產生的Sql語句中,發現Hibernate沒有把quantityPerCtn正確映射成quantity_per_ctn。後來把sql修改爲:

if (!bUnw) {
sql.append(" and m.unitnweight=:unitnweight");
}
if (!bUgw) {
sql.append(" and m.unitgweight=:unitgweight");
}

if (!bQpre) {
sql.append(" and m.quantityPerCtn=:quantityPerCtn");
}

注意,這個時候在每個field前加上了一個別名,就能夠正確映射表的字段明瞭。因爲前兩個Entity類的field名和表的字段名是一樣的,所以不同經過映射也能正確查找,而第三個field和數據表的字段名不對應,而又沒有映射到的話,就會出現問題了。不過好像Hibernate在處理下劃線的時候經常會出現問題,不知道用了以上方法之後能不能解決,還是另有他因,本人是個新手,有n多東西都還在探索當中啊,要多多努力加油!
這有個文章,或許有時候可以參考一下:
[quote]
控制時間 發表於: 2007-7-23 07:35 來源: 創意空間
很多朋友問我在使用Hibernate技術的時候如何解決數據下劃線映射問題。網上有很多已經指出瞭解決方法!但是很多人還是不能搞定。我這裏就把方法直接點說出來!給大家共享!
通過Hibernate映射數據後會發現帶有下劃線的字段被映射成了別的東西。比如有一個字段名稱是這樣的“u_name”那麼Hibernate映射後其名稱就變成了UName,觀察對應的XML文件其中是這麼定義的“<property name="UName" column="u_name" type="string" not-null="true" />”。打開相應的類文件查看。初次看完這個類後會發現沒有問題,但是添加數據的時候會出錯,錯誤如下:“Could not find a getter for UName in class com.table.Tone”錯誤說明了在com.table.Tone這個類裏面找不到UName。
處理方法如下:1.修改XML文件將“UName”更換成“uname”注意是小寫(當然這個名字可以自己定義了)。然後把對應類裏面的私有成員變量 “private String UName;”改成“private String uname”並且替換所有名稱爲“UName”的地方。很多朋友到這裏就卡住了,因爲這樣修改完畢後還是會報“Could not find a getter for UName in class com.table.Tone”錯誤。因爲你只是修改了一半而已。2.還要替換與“UName”相關的set與get方法名稱。(如果要問我爲什麼?那麼我就要說你不瞭解Hibernate的處理機制就不要是用Hibernate了。浪費工具)。這樣就完成了!運行吧!呵呵!
如果還有什麼疑問可以跟貼!
[/quote]
發佈了9 篇原創文章 · 獲贊 1 · 訪問量 3452
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章