Hibernate的标准查询 - 查询条件(Hibernate criteria queries -

2019-10-30 09:52发布

我使用的弹簧3.0和我使用的jqGrid的插件。 我的工作搜索功能,它发送一个JSON字符串的所有搜索条件。 这里是字符串可以是什么样子。

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

如果你看一下规则阵列里面的“OP”属性,你会看到它必须要执行的操作。 该JQ-网格具有以下操作

[ 'Q', 'I', 'L', '的', 'GT', 'G', '体重', 'BN', '在', 'I', 'W', 'EN',' CN '' N“]

这对应于

[“等于”,“不等于”,“少”,“小于或等于”,“更大”,“大于或等于”,“开头”,“不与开始”,“是”,'不是在,‘结尾’,‘不与’,‘包含结束’,‘不包含’]

我打算使用休眠条件进行搜索,使搜索功能。 对于这个我使用杰克逊的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));

Answer 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%'

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



文章来源: Hibernate criteria queries - Query Conditions