2012-04-19 4 views
0

Я использую Spring 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"}]} 

Если вы посмотрите на «оп» собственности внутри правил массива , вы увидите операцию, которая должна быть выполнена. Jq-сетка имеет следующие операции:

['eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'bn', 'in', ' п», 'EW', 'ан', 'сп', 'пс']

что соответствует

[ 'равно', 'не равно', 'меньше', 'меньше или равно', 'больше', 'больше или равно', 'начинается с', 'не начинается с', 'находится в', 'не находится в', 'заканчивается на', 'не заканчивается на', 'содержит', ' не содержит ']

Я планирую использовать критерии поиска в спящем режиме, чтобы включить функцию поиска. Для этого я использую Jackson's 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 зимует команду? Например «сп» должны соответствовать

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

+0

Я сделал некоторые изменения, и приведенное выше отражает мой текущий код, есть ли лучший способ сделать это? – Binaryrespawn

ответ

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

Смежные вопросы