這裏以 Annex(附件) 作爲示例對象:
package com.mrchu.opus;
import java.sql.Blob;
/**
* 附件類
*
* @author 碼農先生
* @version 1.0
* @date 2013-7-18
*/
public class Annex {
private String axId;// 附件ID
private String axName;// 附件名稱
private Blob axContent;// 附件內容
private String axType;// 附件類型
private String axUploader;// 附件上傳者
public String getAxId() {
return axId;
}
public void setAxId(String axId) {
this.axId = axId;
}
public String getAxName() {
return axName;
}
public void setAxName(String axName) {
this.axName = axName;
}
public Blob getAxContent() {
return axContent;
}
public void setAxContent(Blob axContent) {
this.axContent = axContent;
}
public String getAxType() {
return axType;
}
public void setAxType(String axType) {
this.axType = axType;
}
public String getAxUploader() {
return axUploader;
}
public void setAxUploader(String axUploader) {
this.axUploader = axUploader;
}
}
其中 axContent 屬性作爲附件內容屬性,數據庫中以二進制存儲。
那麼在查詢 Annex 表時,往往我們會在 hql 語句中使用 from Annex 進行查詢,這樣查詢的結果是,隨着附件表中的記錄漸漸增多,查詢的速度會逐漸降低,最終導致前臺頁面執行分頁操作時慢的要死。
這裏只是以對象中特殊的 Blob 字段進行解釋,實際開發中還有可能是別的大字段拖慢查詢速度。
解決方法:
1、在Annex對象中添加構造方法
// 無參的構造方法
public Annex(){
super();
}
// 過濾 axContent(Blob字段)的構造方法
public Annex(String axId、String axName、String axType、String axUploader){
this.axId = axId;
this.axName = axName;
this.axType = axType;
this.axUploader = axUploader;
}
2、hql 語句中使用
select new Annex(axId, axName, axType, axUploader)from Annex
進行查詢,這樣就達到了大字段過濾的效果。實際開發中檢驗得知,過濾後的查詢速度簡直是秒殺數據庫!
3.、那麼,這樣一來附件內容屬性不就被拋棄了嗎?如果想實現個附件下載的功能該怎麼辦呢?
解決方法:
1、還是添加構造方法
// 包含附件名稱與附件內容的構造方法
public Annex(String axName、Blob axContent){
this.axName = axName;
this.axContent = axContent;
}
2、hql 語句中使用
select new Annex(axName, axContent)from Annex where axId = ?
進行查詢,其中axName屬性可作爲附件下載時要顯示的附件名稱。
這樣一來,就達到了hql 語句執行查詢時字段過濾的效果。