天天写hql有点麻烦,就自己写了个用来生成hql的工具类:HqlHelper其具体代码如下:
/**
* HQL生成器
* @author cjd
*/
public class HqlHelper {
private String name;
private String hql = "";
private String where = "";
private String order = "";
private List<Object> params = new ArrayList<Object>();
/**
* 构造函数
* @param c 查询的类名
* @param name 别名
*/
public HqlHelper(Class<?> c,String name){
hql = "From " +c.getSimpleName()+" "+name ;
this.name = name;
}
/**
* 向hql语句中添加where约束,例如.addWhere("author=?",user);
* @param condition
* @param value
* @return
*/
public HqlHelper addWhere(String condition,Object obj){
if(where.length()==0){
where = " WHERE "+ condition;
}else{
where += " AND " + condition;
}
params.add(obj);
return this;
}
/**
* 添加条件为null.例如:addConditionIsNull("d.teacher");
* @param condition
* @return
*/
public HqlHelper addConditionIsNull(String condition){
if(where.length()==0){
where = " WHERE "+ condition+ " IS NULL ";
}else{
where += " AND "+ condition + " IS NULL ";
}
return this;
}
/**
* 添加条件不为null.例如:addConditionIsNull("d.teacher");
* @param condition
* @return
*/
public HqlHelper addConditionNotNull(String condition){
if(where.length()==0){
where = " WHERE "+ condition+ " IS NOT NULL ";
}else{
where += " AND "+ condition + " IS NOT NULL ";
}
return this;
}
/**
* 拼接Where子句
*
* @param append
* @param condition
* @param params
*/
public HqlHelper addCondition(String condition, Object param) {
addWhere(condition, param);
return this;
}
/**
* 如果第1个参数为true,则拼接Where子句
*
* @param append
* @param condition
* @param params
*/
public HqlHelper addCondition(boolean append, String condition, Object param) {
if (append) {
addWhere(condition, param);
}
return this;
}
/**
* 拼接OrderBy子句
*
* @param propertyName
* 属性名
* @param isAsc
* true表示升序,false表示降序
*/
public HqlHelper addOrder(String propertyName, boolean isAsc) {
if (order.length() == 0) {
order = " ORDER BY " + propertyName + (isAsc ? " ASC" : " DESC");
} else {
order += ", " + propertyName + (isAsc ? " ASC" : " DESC");
}
return this;
}
/**
* 拼接OrderBy子句
*
* @param propertyName
* 属性名
* @param isAsc
* true表示升序,false表示降序
*/
public HqlHelper addOrder(String propertyName, String order) {
if (this.order.length() == 0) {
this.order = " ORDER BY " + propertyName +" "+ order;
} else {
this.order += ", " + propertyName + " " + order;
}
return this;
}
/**
* 如果第1个参数为true,则拼接OrderBy子句
*
* @param append
* @param propertyName
* 属性名
* @param isAsc
* true表示升序,false表示降序
*/
public HqlHelper addOrder(boolean append, String propertyName, boolean isAsc) {
if (append) {
addOrder(propertyName, isAsc);
}
return this;
}
/**
* 返回sql查询语句
* @return
*/
public String getHQL(){
return hql+where+order;
}
/**
* 返回hql查询语句所需要的参数列表
* @return
*/
public List<Object> getPatams(){
return params;
}
/**
* 返回对应的查询count(*)的hql语句
* @return
*/
public String getCountHQL(){
return "SELECT COUNT(*) "+getHQL();
}
public String getDeleteHQL(){
return "DELETE "+getHQL();
}
}
使用方法(一个完整的异步获取数据的例子,PageUtil是页面封装的一个类):
@RequestMapping(value = "/contentList.do")
public Object jkHomeContentList(HttpServletRequest request,HttpServletResponse response,Integer rows,Integer page,String sort,String order)throws Exception {
HqlHelper hqlHelper = new HqlHelper(TContent.class, "c");
PageUtil pageUtil = new PageUtil(rows,page);
String en_name = request.getParameter("en_name");
String zh_name = request.getParameter("zh_name");
if(en_name==null || en_name.length()==0){
hqlHelper.addCondition("c.en_name like ?", "jk_index_%");
}else{
hqlHelper.addCondition("c.en_name = ?", en_name);
}
if(zh_name!=null && zh_name.trim().length()>0){
hqlHelper.addCondition("c.zh_name like ?", "%"+zh_name.trim()+"%");
}
if(sort!=null){
hqlHelper.addOrder(sort, order);
}
hqlHelper.addOrder("c.en_name",true);
hqlHelper.addOrder("c.position_id", true);
commonService.listByHqlHelper(hqlHelper,pageUtil);
JSONObject result = JSONObject.fromObject(pageUtil);
response.getWriter().write(result.toString());
return null;
}
实际上hibernate本身就提供了不使用hql的查询类Criteria,有兴趣的可以自己去学习,我先入为主,喜欢用自己写的东西,大家看情况吧。