自己写了个类来封装hibernate的hql语句的生成

来源:互联网 发布:阿里云绑定手机客户端 编辑:程序博客网 时间:2024/05/16 14:34

天天写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,有兴趣的可以自己去学习,我先入为主,喜欢用自己写的东西,大家看情况吧。




1 0
原创粉丝点击