HibernateCRUD基础框架(2)-HQL语句构造器(HqlQueryBuilder,HqlUpdateBuilder)
上篇讲述了最基本的实体类,本篇接着讲述HQL语句构造器,包括查询和更新等。
优点:通过面向对象的方式构造HQL语句,更快捷,不需要手动拼接HQL。
缺点:封装可能降低性能,只能支持常用的和较为简单的HQL构造。
部分功能不完善,待开发。
1.HQL语句构造器
package cn.fansunion.hibernate.sql; import org.apache.commons.lang.text.StrBuilder; import cn.fansunion.hibernate.sql.entity.From;
import cn.fansunion.hibernate.sql.entity.GroupBy;
import cn.fansunion.hibernate.sql.entity.OrderGroup;
import cn.fansunion.hibernate.sql.entity.SearchCondition; /**
* HQL语句构造器。
* <p/>
* 目前只适用于1张表的情况,只有查询条件支持占位符,建议使用完全构造的sql语句(是否会产生sql注入,待研究)。
*
* @author LeiWen@FansUnion.cn
*/
public class HqlQueryBuilder extends ConstantBase { // 查询条件组合策略
// -----------------------------------
// *************From******************
// -----------------------------------
private String select; private From from; // -----------------------------------
// *************Where******************
// -----------------------------------
private SearchCondition searchCondition; // -----------------------------------
// *************Group by**************
// ----------------------------------- private GroupBy groupBy; // -----------------------------------
// *************Order by******************
// -----------------------------------
private OrderGroup orderGroup; // -----------------------------------
// 通过构造方法,创建查询构造器。各种字段组合形式的构造方法太多,只给出3种比较常见的。
// 建议使用链式构造或setter方法设置属性。
// -----------------------------------
public HqlQueryBuilder() { } public HqlQueryBuilder(From from) {
this.from = from;
} public HqlQueryBuilder(From from, SearchCondition searchCondition,
GroupBy groupBy, OrderGroup orderGroup) {
this.from = from; this.searchCondition = searchCondition;
this.groupBy = groupBy;
this.orderGroup = orderGroup;
} public HqlQueryBuilder select(String select) {
this.select = select;
return this;
} // -----------------------------------
// 支持链式用法,暂时不能很好地支持**************
// -----------------------------------
public HqlQueryBuilder from(From from) {
this.from = from;
return this;
} public HqlQueryBuilder from(String model) {
doFrom(model, "");
return this;
} public HqlQueryBuilder from(String model, String alias) {
doFrom(model, alias);
return this;
} public HqlQueryBuilder from(Class<?> clazz) {
doFrom(clazz.getSimpleName());
return this;
} public HqlQueryBuilder from(Class<?> clazz, String alias) {
doFrom(clazz.getSimpleName(), alias);
return this;
} private void doFrom(String model) {
doFrom(model, null);
} private void doFrom(String model, String alias) {
this.from = new From(model, alias);
} public HqlQueryBuilder searchCodition(SearchCondition searchCondition) {
this.searchCondition = searchCondition;
return this;
} public HqlQueryBuilder groupBy(GroupBy groupBy) {
this.groupBy = groupBy;
return this;
} public HqlQueryBuilder orderBy(OrderGroup orderGroup) {
this.orderGroup = orderGroup;
return this;
} /**
* 转换成HQL语句
*/
public String toHql() { StrBuilder builder = new StrBuilder();
if (select != null) {
builder.append(select).append(EMPTY);
}
if (from != null) {
builder.append(from);
} if (searchCondition != null) {
builder.append(searchCondition);
}
if (groupBy != null) {
builder.append(groupBy);
}
if (orderGroup != null) {
builder.append(orderGroup);
} return builder.toString();
} }
2.Hql更新语句构造器
下面这个是构造更新HQL语句的构造器,待完善。
package cn.fansunion.hibernate.sql.update; import java.util.HashMap;
import java.util.Map; import cn.fansunion.hibernate.util.Pair; /**
* Hql更新语句构造器。(TODO 待完善)
*
* @author LeiWen@FansUnion.cn
*/
public class HqlUpdateBuilder { private Map<String, Object> params; private String model; public HqlUpdateBuilder() {
params = new HashMap<String, Object>();
} public HqlUpdateBuilder(String model) { } public HqlUpdateBuilder(Class<?> model) {
this.model = model.getSimpleName();
} public HqlUpdateBuilder model(String model) {
this.model = model;
return this;
} public HqlUpdateBuilder model(Class<?> model) {
this.model = model.getSimpleName();
return this;
} public HqlUpdateBuilder param(String key, Object value) {
params.put(key, value);
return this;
} public HqlUpdateBuilder param(Pair... pair) {
for (Pair p : pair) {
params.put(p.getKey(), p.getValue());
}
return this;
} public HqlUpdateBuilder param(Map<String, Object> params) {
this.params.putAll(params);
return this;
} public String toHql() {
String hql = "update " + model + " set ";
for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
hql += key + "=:" + key + " ";
}
return hql;
} }
3.原生SQL语句构造器
类似的,有时候,可能不用Hibernate的HQL,而是用原生的SQL。
这个时候,可以编写与HqlQueryBuilder和HqlUpdateBuilder相应的SQL版本。
package cn.fansunion.hibernate.sql; import cn.fansunion.hibernate.sql.entity.Limit; /**
* 原生SQL语句构造器。(TODO 待完善)
*
* @author LeiWen@FansUnion.cn
*/
public class SqlQueryBuilder {
// limit只适用于nativeSQL
// -----------------------------------
// *************limit**************
// -----------------------------------
private Limit limit; /**
* 转换成SQL语句
*/ public String toSql(){
//TODO
return null;
}
}
4.HQL查询构造器使用例子
/**
* HQL查询构造器使用例子。
*
* @author LeiWen@FansUnion.cn
*/
public class HqlQueryBuilderTest extends ConstantBase { @Test
public void test() {
From from = new From(HqlQueryBuilder.class);
SearchCondition searchCondition = createSearchCondtion();
OrderGroup orderGroup = createOrderGroup();
GroupBy groupBy = createGroupBy();
HqlQueryBuilder builder = new HqlQueryBuilder(from, searchCondition,
groupBy, orderGroup);
// 直接打印,不使用“断言”
println(builder.toHql());
} private GroupBy createGroupBy() {
GroupBy groupBy = new GroupBy();
groupBy.addGroup("name");
groupBy.addGroup("id");
return groupBy;
} private OrderGroup createOrderGroup() {
Order order1 = new Order("id", false);
Order order2 = new Order("name", "asc"); OrderGroup orderGroup = new OrderGroup(order1, order2);
return orderGroup;
} private SearchCondition createSearchCondtion() {
GroupCondition groupCondition1 = oneGroupCondition();
GroupCondition groupCondition2 = oneGroupCondition();
//String groupStr1 = groupCondition1.toString();
//String groupStr2 = groupCondition2.toString();
// System.out.println(groupStr1);
// System.out.println(groupStr2); SearchCondition searchCondition = new SearchCondition();
searchCondition.addGroupCondition(groupCondition1);
searchCondition.addGroupCondition(groupCondition2, true);
//String searchStr = searchCondition.toString();
// System.out.println(searchStr);
return searchCondition;
} private GroupCondition oneGroupCondition() {
// =,Integer
String age = "age";
Integer ageValue = 24;
Condition condition2 = new Condition(age, Operator.EQUALS, ageValue);
String str2 = condition2.toString(); Assert.assertEquals(str2, age + EQUALS_WITH_BLANK + ageValue); // =,String
String name = "name";
String nameValue = "LeiWen@FansUnion.cn";
Condition condition = new Condition(name, Operator.EQUALS, nameValue);
String str = condition.toString();
Assert.assertEquals(str, name + EQUALS_WITH_BLANK
+ buildQuota(nameValue)); // =,Date
String date = "date";
Date dateValue = new Date();
Condition condition3 = new Condition(date, Operator.EQUALS, dateValue);
String str3 = condition3.toString();
Assert.assertEquals(str3, date + EQUALS_WITH_BLANK
+ buildQuota(dateValue)); GroupCondition groupCondition1 = new GroupCondition();
groupCondition1.addCondition(condition);
groupCondition1.addCondition(condition2, true);
groupCondition1.addCondition(condition3, false);
return groupCondition1;
} }
5.输出结果
from HqlQueryBuilder where (name = 'LeiWen@FansUnion.cn' or age = 24 and date = 'Mon Dec 30 16:57:21 CST 2013')
or (name = 'LeiWen@FansUnion.cn' or age = 24 and date = 'Mon Dec 30 16:57:21 CST 2013')
group by name,id order by id desc,name asc
原文链接:http://blog.fansunion.cn/articles/3622(小雷博客-blog.fansunion.cn)
HibernateCRUD基础框架(2)-HQL语句构造器(HqlQueryBuilder,HqlUpdateBuilder)的更多相关文章
- HibernateCRUD基础框架(1)-实体类
HibernateCRUD基础框架包括3篇文章,主要讲述整个CRUD基础框架的思路. 第1篇:讲述最基本的实体类,这些实体类是对SQL语言中的一些概念的封装. 第2篇:在这些实体类的基础上,开发一个& ...
- HibernateCRUD基础框架(3)-简单的和较为复杂的标准的CRUD API
优点:简单的和基础的CRUD功能可以很快实现,可以说是比较的"标准化".维护起来也很容易. 缺点:性能没有保障.不支持特别复杂的CRUD. 可以适用的场景:小型Web项目 1.Cr ...
- Hibernate框架HQL语句
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...
- 用Hibernate框架把hql生成可执行的sql语句-Oracle方言
引言:为什么这样的需求,源自公司项目需要,公司的项目使用java的struts2+spring2.5+oracle中间件tuxedo,数据库用的是Oracle,但由于不直接连接数据库,用中间件处理的方 ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- Hibernate框架之HQL查询与Criteria 查询的区别
Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: ...
- 一篇文章带你掌握主流基础框架——Spring
一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- PHP 设计模式 笔记与总结(2)开发 PSR-0 的基础框架
[PSR-0 规范的三项约定]: ① 命名空间必须与绝对路径一致 ② 类名的首字母必须大写 ③ 除入口文件外,其他".php"必须只有一个类(不能有可执行的代码) [开发符合 PS ...
随机推荐
- 洛谷 P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L…
P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L… 题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many simi ...
- ADB高级应用
ADB高级应用 一.利用无线来查看adb shell > adb tcpip 5555 连接: > adb connect IP:5555 见后文<调试注意事项> 二.模拟按键 ...
- 转战Androidstudio之项目eclipse迁移
新项目開始,决定转战as战场,(是应为听说了太多关于as的夸赞我才来的),期间各种不爽不适应历历在目啊.闲话少说,项目迁移開始 1.Eclipse迁出 当然直接从Eclipse迁出是有条件的,ADT必 ...
- Android自己定义视图(一):带下划线的TextView
package com.francis.underlinetextviewtest; import android.content.Context; import android.content.re ...
- CSS动态实现文本框清除按钮的隐藏与显示
当前现代浏览器中,Chrome浏览器下type=search的输入框会有清除按钮的动态呈现,不过搜索input框尺寸不太好控制(padding无视):FireFox浏览器貌似任何类型的输入框都无动于衷 ...
- POJ 2079 Triangle 旋转卡壳求最大三角形
求点集中面积最大的三角形...显然这个三角形在凸包上... 但是旋转卡壳一般都是一个点卡另一个点...这种要求三角形的情况就要枚举底边的两个点 卡另一个点了... 随着底边点的递增, 最大点显然是在以 ...
- CSS布局篇——固宽、变宽、固宽+变宽
学了前端挺久了.近期写一个项目測试系统,布局时发现自己对变宽+固宽的布局还没有全然掌握,所以在这里总结一下,以后须要的时候回头看看. 1.最简单的当然是一列或多列固宽 比如两列固宽: <1> ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- 使用STS新的工作空间无需再配置
在你的新的工作空间中找到比如 F:\java-wokespace\你的新的工作空间名称\.metadata\.plugins\org.eclipse.core.runtime\.settings 找到 ...
- js中event事件处理
1. HTML事件 直接添加到HTML结构中 function show() { alert('hello'); } <body> <button id="btn&quo ...