Hibernate结合JPA编写通用泛型多条件查询
项目中使用Hibernate和JPA对数据库对象进行实例化,但是生成的方法不支持多条件查询。而如果针对每一个数据库对象进行多条件查询编码,则会变得很麻烦,而且一旦以后发生表结构发生变化,这些方法可能还需要进行重新编码。所以考虑编写一个方法可以对数据库对象进行多条件查询,并返回泛型对象,这样就可以方便使用。具体实现思路如下:
第一步:编写数据库查询参数对象,此部分包含两个,一个是查询实体名称(QueryCondition.java),一个是数据库查询条件对象(QueryParameter.java)。
数据库查询条件对象(QueryParameter.java)包含三个参数,分别为参数名、参数值、查询条件表达式
package com.imstudio.jpa;
public class QueryParameter {
    public enum QueryOperateType {
        Equal, CharIn
    }
    public String ParameterName;
    public Object ParameterValue;
    public QueryOperateType ParameterType;
    public QueryParameter() {
    }
    public QueryParameter(String parameterName, Object parameterValue,
            QueryOperateType parameterType) {
        this.ParameterName = parameterName;
        this.ParameterValue = parameterValue;
        this.ParameterType = parameterType;
    }
    public String getParameterName() {
        return ParameterName;
    }
    public QueryOperateType getParameterType() {
        return ParameterType;
    }
    public Object getParameterValue() {
        return ParameterValue;
    }
    public void setParameterName(String parameterName) {
        ParameterName = parameterName;
    }
    public void setParameterType(QueryOperateType parameterType) {
        this.ParameterType = parameterType;
    }
    public void setParameterValue(Object parameterValue) {
        ParameterValue = parameterValue;
    }
}
查询对象实体(QueryCondition.java)包含查询实体名称以及查询参数对象
package com.imstudio.jpa; import java.util.ArrayList;
import java.util.List; public class QueryCondition {
public String ModelName;
public List<QueryParameter> Parameters = new ArrayList<QueryParameter>(); public QueryCondition() { } public QueryCondition(String modelName) {
this.ModelName = modelName;
} public QueryCondition(String modelName, List<QueryParameter> parameters) {
this.ModelName = modelName;
this.Parameters = parameters;
} public void add(QueryParameter queryParameter) {
this.Parameters.add(queryParameter);
} public String getModelName() {
return ModelName;
} public List<QueryParameter> getParameters() {
return Parameters;
} public void setModelName(String modelName) {
ModelName = modelName;
} public void setParameters(List<QueryParameter> parameters) {
Parameters = parameters;
}
}
在完成上述两个实体对象之后就可以具体查询方法的编写了,在查询中使用到一个变量querySymbols,下述编码是从配置文件web.xml中获取,这里主要是为了在使用不同数据库的时候查询关键字标示符的修改。同时为了增加查询方法的通用性,查询返回数据这里定义为泛型。
package com.imstudio.jpa; import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level; import javax.persistence.EntityManager;
import javax.persistence.Query; import org.apache.struts2.ServletActionContext; import com.imstudio.jpa.QueryParameter.QueryOperateType; public class QueryDataAction { public String errorCode; public QueryDataAction() {
} public QueryDataAction(String errorCode) {
this.errorCode = errorCode;
} public String getErrorCode() {
return errorCode;
}; @SuppressWarnings("unchecked")
public <T> List<T> queryByPropertys(QueryCondition queryCondition) {
String querySymbols = ServletActionContext.getServletContext()
.getInitParameter("QuerySymbols");
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("select model \n");
sqlBuffer.append("from " + queryCondition.ModelName + " as model \n");
boolean first = true;
for (int pi = 0; pi < queryCondition.Parameters.size(); pi++) {
if (queryCondition.Parameters.get(pi).getParameterName() != null) {
if (first) {
sqlBuffer.append("where ");
first = false;
} else {
sqlBuffer.append("and ");
}
if (queryCondition.Parameters.get(pi).getParameterType() == QueryOperateType.Equal) {
sqlBuffer.append("model."
+ queryCondition.Parameters.get(pi)
.getParameterName()
+ " = "
+ querySymbols
+ queryCondition.Parameters.get(pi)
.getParameterName() + " \n");
} else if (queryCondition.Parameters.get(pi).getParameterType() == QueryOperateType.CharIn) {
sqlBuffer.append("InStr(model."
+ queryCondition.Parameters.get(pi)
.getParameterName()
+ " , "
+ querySymbols
+ queryCondition.Parameters.get(pi)
.getParameterName() + " ) > 0 \n");
}
}
}
List<T> list = new ArrayList<T>();
try {
EntityManagerHelper.log(sqlBuffer.toString(), Level.INFO, null);
EntityManager emEntityManager = EntityManagerHelper
.getEntityManager();
Query queryObject = emEntityManager.createQuery(sqlBuffer
.toString());
for (int li = 0; li < queryCondition.Parameters.size(); li++) {
queryObject.setParameter(queryCondition.Parameters.get(li)
.getParameterName(), queryCondition.Parameters.get(li)
.getParameterValue());
}
list = queryObject.getResultList();
emEntityManager.close(); } catch (RuntimeException re) {
errorCode += "CM000006";
EntityManagerHelper.log("queryByPropertys error", Level.SEVERE, re);
throw re;
}
return list;
} public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
} }
使用上述方法配合Hibernate、JPA的生成代码就可以进行多条件查询了。欢迎和大家多多沟通学习,如有任何改进意见和建议,我的QQ是1243672,欢迎联系哦。
Hibernate结合JPA编写通用泛型多条件查询的更多相关文章
- Spring Data JPA,一种动态条件查询的写法
		
我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...
 - jpa中使用Query判断条件查询
		
jpa中使用Query判断条件查询 @Query(value = " select m.* from mining_area as m " + " where 1 = 1 ...
 - SpringMVC整合Hibernate实现增删改查之按条件查询
		
首先我贴出我项目的结构,只完成了条件查询的相关代码,增删改没有写. 1.新建一个动态Web工程,导入相应jar包,编写web.xml配置文件 <context-param> <par ...
 - orm 通用方法——GetOneModel 条件查询一个对象
		
数据连接层的方法封装成通用方法是很有必要,节省不必要的重复写代码. Golang的orm.xorm框架没有封装这些操作. 这里是一个查询单个对象的方法. 此处抛砖引玉,大家继续完善. 通用方法定义代码 ...
 - orm 通用方法——QueryModelCount条件查询记录数
		
定义代码: /** * 描述:根据条件查询对象数 * 作者:Tianqi * 日期:2014-09-17 * param:model 对象实例 * param:cond 查询条件 * return:i ...
 - 必须知道的SQL编写技巧,多条件查询不拼字符串的写法
		
在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行 ...
 - 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate
		
一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...
 - 泛型理解及应用(二):使用泛型编写通用型Dao层
		
相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板.对于Hibernate生成 ...
 - Hibernate JPA 动态criteria语句针对null查询条件的特殊处理
		
最近原Hibernate项目需要添加一个条件,结构有点类似下面的格式,学生和房间是多对一的关系,现在要查询所有没有房间的学生. Class Student{ @ManyToOne Room room; ...
 
随机推荐
- Java调用Python脚本并获取返回值
			
在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...
 - Which adidas NMD Singapore is your favorite
			
The adidas NMD Singapore just keeps the hits coming this fall with another change that's sure to bec ...
 - 系统管理命令之w
			
区别于who命令,w命令不仅可以看到登录服务器的用户信息,而且可以看到这些用户做了什么 1.查看该命令的帮助信息. # w --help 2.查看该命令的版本信息. # w --version 3 ...
 - Conductor
			
https://netflix.github.io/conductor/ High Level Architecture
 - SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数
			
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...
 - 20145221 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
			
20145221 <Java程序设计>实验报告一:Java开发环境的熟悉(Windows+IDEA) 实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调 ...
 - Java第一周学习总结5311
			
20145311 <Java程序设计>第1周学习总结 教材学习内容总结 第一章1.1java的历史:总的来说,Java经历了许许多多版本的变迁,目前已经成为一种经常使用的计算机编程语言.J ...
 - 20145315 《Java程序设计》第八周学习总结
			
20145315 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章通用API 15.1日志 15.1.1日志API简介 使用日志的起点是logger类,logger实例的创建 ...
 - 【热更新IK词典】ElasticSearch IK 自动热更新原理与实现
			
一.热更新原理 elasticsearch开启加载外部词典功功能后,会每60s间隔进行刷新字典.具体原理代码如下所示: public void loadDic(HttpServletRequest r ...
 - 【查看内存】Linux查看内存使用情况(二)
			
Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内 ...