JPA - criteria как составить запрос динамически?

0
19 мая 2015 03:24
Приходят параметры с формы jsp страницы, если какое-либо поле = null или "", этот параметр участвовать в запросе не должен, придумал небольшой велосипед, т.к. из коробки ничего не нашел.
private static String conditionString = "";
private static boolean andFlag = false;

public static void setField(String fieldName, String condition, String param)
                            throws UnsupportedEncodingException{
        if(param == null || param.equals(""))
            return;
        if(conditionString.equals("")){
            conditionString += "WHERE ";
        }
        if(andFlag)
            conditionString += " AND ";
        conditionString +=  fieldName + " " + condition;
        andFlag = true;
        conditionString = conditionString.replace(":?", param);
    } 

В идеале хотел сделать запрос через criteria, но как включать условия отбора динамически (в зависимости от условия в коде) ничего не нашел, только запрос с предопределенными полями, разве нужно под все комбинации параметров (null, "string", null / "string", null, null / и т.д. ) составлять отдельные запросы?
Есть еще одна заморочка, мне нужно искать данные в mysql по такой регулярке: (^|[ ]){1}СТРОКА([ ]|$){1}'), чтобы в искало только целые слова, создаю запрос:
EntityManager em = HibernateUtil.getEm();
em.createCuery();

подставляю в запрос REGEXP '(^|[ ]){1}:?([ ]|$){1}' - регулярка в mysql, hibernate ругается что не знает что такое REGEXP, нативный запрос делать не хотелось бы
em.createNativeCuery()

Подскажите как решить задачку, т.к. с hibernate знаком несколько дней, в какую сторону смотреть?

Ответов: 2

1
19 мая 2015 06:33
В контроллере, из запроса который вам приходит можно соорудить EnumMap. И потом использовать его для создания Criteria.

EnumMap<SearchKey, String> conditions = ...
Criteria criteria = session.createCriteria(MyClass.class, "myclass");
conditions.forEach((key, value) -> {
    switch ( key ) {
        case PARAM:
            criteria.add(Restrictions.eq("myclass.myparam", value));
            break;
        // ...
        default:
            break;
});


Если параметр null/blank просто не кладите его в мапу. Проверку на null/blank лучше вынести в утилитный метод, или доверить commons.StringUtils. На строках делать плохо, потом любое переименование или опечатка будут вам стоить пары часов дебага.




0
06 авг 2018 18:38
А это нормально - использование мапы в таких случаях?
Модераторы: Нет
Сейчас эту тему просматривают: Нет