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"}]}

rules配列内の「op」プロパティを見ると、実行する必要がある操作がわかります。Jq-grid には次の操作があります。

['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en',' cn','nc']

対応する

[「等しい」、「等しくない」、「小さい」、「小さいか等しい」、「大きい」、「大きいか等しい」、「で始まる」、「で始まらない」、「ではない」、「ではない」 in','ends with','does not end with','contains','does not contain']

検索機能を有効にするために、休止状態の基準検索を使用する予定です。このために、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}

ここで問題が発生します。jqGrid 操作を同等の hibernate コマンドに変換するにはどうすればよいですか? たとえば、 「cn」は次のように対応する必要があります

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

4

1 に答える 1

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

これは、私が期待していた「含む」操作です。おそらくこれはあなたの問題でもありますか?

于 2012-04-22T13:39:32.720 に答える