zoukankan      html  css  js  c++  java
  • 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 
    ");
            sqlBuffer.append("from " + queryCondition.ModelName + " as model 
    ");
            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() + " 
    ");
                    } 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 
    ");
                    }
                }
            }
            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,欢迎联系哦。

  • 相关阅读:
    LINQ查询操作符之First、FirstOrDefault、Last、LastOrDefault、ElementAt、ElementAtOrDefault、Contains、Any、All、Coun
    .Net 使用的快捷键
    P2073 送花
    洛谷P1514 引水入城
    花园
    八数码难题
    并查集题目整理
    树链剖分(强势借鉴)
    模拟题
    考试整理
  • 原文地址:https://www.cnblogs.com/songhaipeng/p/3328279.html
Copyright © 2011-2022 走看看