# DynamicHibernate **Repository Path**: wstv/DynamicHibernate ## Basic Information - **Project Name**: DynamicHibernate - **Description**: 项目不存在商业价值,广大学习爱好者可根据自己的喜好重构融入到自己的hibernate项目中,项目就是一个简单的basedao的封装查询 方便快捷 和生硬的hibernate 相比较 优点在于 :“灵活的查询方式、灵活的ql语句管理、自动实现sql/hql语句的切换执行。” 因为模板采用的是freemarker技术,所以:语句模板块类似于mybatis 配置文件方式,支持各种if for相关标签语法 。 相关用法请参见 freemarker官方语法,简单易懂 分分钟上手。 项目简单的实现方式就是 使用freemarke api来读取模板缓存文件节点的内容 读取到之后就是对应的sql 或hql 然后由hibernate 来执行语句来执行。项目中大多使用了泛型技术,比如返回值的封装 等等。 支持各种各样的方式查询。 实现了简单的“CRUD” 不像硬编码的方式 将sql或者hql写死到代码里面 维护起来很复杂。使得项目代码看起来也比较杂乱。 這样封装以后代码是代码 hql/sql 单独存在 便于管理。 QQ:1099532501 职业:JAVA DEVELOPER 个人网站:http - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2019-12-08 - **Last Updated**: 2025-05-23 ## Categories & Tags **Categories**: database-dev **Tags**: None ## README 项目名称:DynamicHibernate 项目链接:[DynamicHibernate](https://gitee.com/wstv/DynamicHibernate) 该项目由作者“汉源魂”在Gitee上开源,其核心价值在于提供一个非商业性的学习资源,旨在帮助广大开发者更加便捷地整合并优化Hibernate的使用体验。该项目通过一种基于`FreeMarker`技术的创新方式,对Hibernate的传统查询方式进行扩展和封装,主要特点如下: 1. **灵活查询**:提供了不同于Hibernate原生查询方式的灵活查询机制,用户可以根据需求自定义和管理QL(SQL或HQL)语句。 2. **语句管理**:采用类似MyBatis的配置文件样式,利用Freemarker模板技术,支持包含if、for等标签的复杂逻辑编写,简化了SQL/HQL语句的组织与维护。 3. **动态执行**:项目会动态读取模板缓存文件中的SQL或HQL语句,并交由Hibernate引擎执行,从而避免了硬编码SQL/HQL带来的维护难题。 4. **泛型应用**:项目广泛运用了泛型技术,特别是在数据结果集的封装方面,确保了查询操作的通用性和可扩展性。 5. **CRUD支持**:实现了基础的创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)功能,降低了编码复杂度,使得代码更易于管理和维护。 总结来说,DynamicHibernate通过结合Freemarker模板引擎和Hibernate ORM框架,提升了数据库操作的灵活性和代码整洁度,有助于提升开发效率和降低后期维护成本。 QQ:1099532501 职业:JAVA DEVELOPER ArrayList conditions = new ArrayList(); ######普通字段筛选条件 ``` String id = "06f8f0ef-0916-40c7-a354-2457e628293f"; conditions.add(new Condition("id",id, Op.EQ, OpType.AND)); ``` ######关联对象字段筛选条件 ``` String deptName = "研发部2"; conditions.add(new Condition("dept.name",deptName, Op.EQ, OpType.AND)); ``` ######多字段组合条件 column ="xxx,xxx,xxx" 中间用英文逗号隔开即可。 意思为需要满足当前where 1=1 and (name='wstv' and sex='wstv') //如果是 GROUP_AND_OR = where 1=1 or (name='wstv' or sex='wstv') ``` conditions.add(new Condition("name,sex","1", Op.EQ, OpType.GROUP_AND_AND)); List list = employeeService.findList(conditions, null); System.out.println(JSON.toJSONString(list)); ``` ######order by 用法 ``` conditions.add(new Condition("name","1", Op.EQ, OpType.AND)); LinkedHashMap orderby = new LinkedHashMap(); orderby.put("name",OrderType.ASC); List list = employeeService.findList(null, orderby); System.out.println(JSON.toJSONString(list)); ``` ######分页用法 ``` conditions.add(new Condition("dept.name","研发部2", Op.EQ, OpType.AND)); LinkedHashMap orderby = new LinkedHashMap(); orderby.put("name",OrderType.ASC); //pageIndex 第几页 pageSize = 每页要显示多少条 PageBean page = employeeService.findPage(conditions, orderby, 1, 10); System.out.println(JSON.toJSONString(page)); ``` ######动态模板的用法 hql方式 ``` String queryName = "emp.findById"; Map parameters = new HashMap(); parameters.put("id","06f8f0ef-0916-40c7-a354-2457e628293f"); PageBean pageBean = baseDao.queryByDynamicName(queryName, 1,10, Employee.class,null, parameters); List data = pageBean.getData(); if (data!=null && !data.isEmpty()){ System.out.println(JSON.toJSONString(data)); } ``` ######动态模板的用法 sql 方式 ``` //动态模板语句返回的字段,需要和模板的sql字段顺序保持一致 String[] fields = new String[]{ "id", "name" }; String queryName = "emp.findByName"; Map parameters = new HashMap(); parameters.put("id","06f8f0ef-0916-40c7-a354-2457e628293f"); PageBean> pageBean = employeeService.findByNamedQuery(queryName, 1, 10, fields, parameters); List> data = pageBean.getData(); if (data!=null && !data.isEmpty()){ for(Map map : data){ System.out.println(map.get("id")); } } ``` 个人网站:https://blog.hyaroma.com 个人摄影:https://tuchong.com/1649042/ [![alt text]( "hibernate")](https://liweiwstv.oss-cn-beijing.aliyuncs.com/143042.png)