Hibernate 之 hql 語句執行字段過濾查詢

這裏以 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 語句執行查詢時字段過濾的效果。

發佈了41 篇原創文章 · 獲贊 18 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章