zoukankan      html  css  js  c++  java
  • JPA使用Specification like查询时特殊字符%和_处理问题 Escape示例

    当使用JPA的Specification处理like查询时,如果含有特殊字符%和_,则需要使用以下API处理问题:

    hibernate-jpa-2.1-api-1.0.2.Final.jar

    Predicate like(Expression<String> var1, String var2, char var3);

    第三个参数是escape关键字,必须是char。

    此api存在hibernate-jpa-2.1-api-1.0.2.Final.jar包的CriteriaBuilder中。
    代码如下:
     Map para = new HashMap();
            para.put("isSoftDel", 0);        
            para.put("title", title);
            
            Sort sort = new Sort(Sort.Direction.DESC, "createTime");
            Page pageInfo = repository.findAll(service.getSpecificationForPage(para), getPageable(limit, page, sort));
    

      

    public Specification getSpecificationForPage(Map para) {
            return new Specification() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> list = new ArrayList<>();              
    
                    Predicate predicate1 = criteriaBuilder.and(criteriaBuilder.equal(createBy, para.get("createBy")));
                    Predicate predicate2 = criteriaBuilder.and(criteriaBuilder.notEqual(createBy, para.get("createBy")), criteriaBuilder.equal(publishStatus, para.get("publishStatus")));
                    Predicate predicate = criteriaBuilder.or(predicate1, predicate2);
                    list.add(predicate);
    
                    JPAUtil.like(list, criteriaBuilder, root, "title", para);
    
                    return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
                }
            };
        }
    

      

    public static void like(List<Predicate> predicates,CriteriaBuilder cb, Root<?> root, String colmun, Map para) {
            like(predicates,cb,root,colmun,para,colmun);
        }
    
        public static void like(List<Predicate> predicates,CriteriaBuilder cb, Root<?> root, String colmun, Map para,String paraKey) {
            if(!checkPara(paraKey,para)){
                return;
            }
            try {
                String title = (String) para.get(paraKey);
                if(title.contains("_") || title.contains("%")){
                    //注:""被作为转义字符时必须也被转义
                    title = title.replace("\","\\").replace("_","\_").replace("%","\%");
                    predicates.add(cb.like(root.get(colmun), "%" + title + "%",'\'));
                }else{
                    predicates.add(cb.like(root.get(colmun), "%" + para.get(paraKey) + "%"));
                }
            } catch (Exception e) {
                e.printStackTrace();
                predicates.add(cb.like(root.get(colmun), "%" + para.get(paraKey) + "%"));
            }
        }
    

      在此做以记录。

  • 相关阅读:
    Sql server Always On 读写分离配置方法
    MSSQL AlwaysOn中的“主角色中的连接”和“可读辅助副本”
    Windows Server 2019 Active Directory (AD域)时间不同步的解决方法
    windows server 2008 R2 域中用组策略隐藏指定磁盘驱动器(盘符)
    pg数据库优化
    Qlik
    如何查看数据库特别慢
    针对数量的null值最好要做变0处理
    pg如何实现月份的加减
    sql
  • 原文地址:https://www.cnblogs.com/weizhxa/p/12264864.html
Copyright © 2011-2022 走看看