2012-04-19 125 views
0

我使用的是spring 3.0,我使用的是JqGrid插件。我正在处理搜索功能,它发送一个带有所有搜索条件的json字符串。这是字符串的样子。Hibernate条件查询 - 查询条件

{"groupOp":"AND","rules":[{"field":"firstName","op":"bw","data":"John"},{"field":"lastName","op":"cn","data":"Doe"},{"field":"gender","op":"eq","data":"Male"}]} 

如果你看一下“OP”规则数组内的财产,你会看到它必须要执行的操作。 Jq格有以下操作

['eq','ne','lt','le','gt','ge','bw','bn','in','に”, 'EW', 'EN', 'CN', 'NC']

[对应 '等于', '不等于', '少', '小于或等于', '更大','大于或等于','开始于','不以'开始,''在','不在','以'结束','不以'结尾,'包含','不包含']

我打算使用休眠条件搜索来启用搜索功能。为此,我使用Jackson的ObjectMapper将传入的JSON转换为Java。这一切都很好。这是我的代码转换JSON。

public class JsonJqgridSearchModel { 

    public String groupOp; 

    public ArrayList<JqgridSearchCriteria> rules; 
} 


public class JqgridSearchCriteria { 

    public String field; 

    public String op; 

    public String data; 

public SimpleExpression getRestriction(){ 
    if(op.equals("cn")){ 
     return Restrictions.like(field, data); 
    }else if(op.equals("eq")){ 
     return Restrictions.eq(field, data); 
    }else if(op.equals("ne")){ 
     return Restrictions.ne(field, data); 
    }else if(op.equals("lt")){ 
     return Restrictions.lt(field, data); 
    }else if(op.equals("le")){ 
     return Restrictions.le(field, data); 
    }else if(op.equals("gt")){ 
     return Restrictions.gt(field, data); 
    }else if(op.equals("ge")){ 
     return Restrictions.ge(field, data); 
    }else{ 
     return null; 
    }  
} 

} 

@RequestMapping(value = "studentjsondata", method = RequestMethod.GET) 
    public @ResponseBody String studentjsondata(@RequestParam("_search") Boolean search ,HttpServletRequest httpServletRequest) { 
     StringBuilder sb = new StringBuilder(); 
     Format formatter = new SimpleDateFormat("MMMM dd, yyyy"); 
     if(search){ 
      ObjectMapper mapper = new ObjectMapper(); 
      try { 
        JsonJqgridSearchModel searchModel= mapper.readValue(httpServletRequest.getParameter("filters"), JsonJqgridSearchModel.class); 
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
        Session session = sessionFactory.openSession(); 
        session.beginTransaction(); 
        Criteria criteria = session.createCriteria(Person.class);     
       Iterator<JqgridSearchCriteria> iterator = searchModel.rules.iterator(); 
       while(iterator.hasNext()){ 
        System.out.println("before"); 
        criteria.add(iterator.next().getRestriction()); 
        System.out.println("after"); 
       }     
       } catch (JsonParseException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

     }else{//do other stuff here} 

这就是问题的用武之地。我如何transalate的jqGrid的操作进入冬眠equivelent命令?例如 “CN”应该

criteria.add(Restrictions.like("firstName", myJsonJqgridSearchModel.data));

+0

我做了一些编辑,上面反映了我目前的代码,有没有更好的方法来做到这一点? – Binaryrespawn 2012-04-20 15:54:10

回答

1

有趣的是,我刚写的几乎相同的代码对应于你所拥有的上述(我不使用的jqGrid不过)。我想知道您的问题是否与“cn” - LIKE条件特别相关?我有这个问题 - 我必须指定MatchMode获得“含有”像我想:

return Restrictions.ilike(
    searchCriterion.getPropertyName(), 
    searchCriterion.getValue().toString(), 
    MatchMode.ANYWHERE); 

我发现,没有指定MatchMode,它生成的SQL为:

WHERE property LIKE 'value' 

通过指定MatchMode.ANYWHERE,它生成的SQL为:

WHERE property LIKE '%value%' 

这是“包含”的操作,我所期待的。也许这也是你的问题?

+0

非常感谢您的提醒,我会尝试一下,看看它是如何发展的。 – Binaryrespawn 2012-04-23 12:23:45