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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章