Гибернация: Критерий. можно ли создать список ограничений, а затем добавить его в объект Critera

У меня есть динамический поиск с 25 необязательными параметрами. HQl не вариант. Я использую Criterion API. У меня есть методы DAO, которые я хотел бы принять в список «Ограничений», который я могу создать на своем уровне службы, чтобы при вызове метода DAO из службы следующим образом:

Lits<myPojoClass> = myDAO.getDataByCriterion( <?Restriction List?> )

myDAO.getDataByCriterion может использовать «Список ограничений» следующим образом:

inside the myDAO class

Public List<myPojoClass> getDataByCriterion( <?Restriction List?> restrictionList) {
    Session s = HibernateUtil.currentSession();
    Criteria c = s.createCriteria(myPojo.class)
                  .add(Restrictions ( <?Restriction List?>  );  //attach the list here
    List<myPojoClass> response = c.list();

Кажется, что-то, что вы должны быть в состоянии сделать. Можно ли добавить ограничения, переданные в метод DAO


person JJRutter    schedule 17.07.2012    source источник
comment
Объявление одного аргумента типа Criterion, возможно, является лучшей идеей, потому что таким образом вы всегда имеете определенный критерий. Имея их список, вы должны подумать о логической операции по умолчанию для их интерпретации. Возможно, это будет конъюнкция, но первый способ более гибкий. С другой стороны, я бы избегал такого дизайнерского решения, потому что оно нарушает инкапсуляцию для уровня DAO. Вам потребуются спящие зависимости. Я бы предложил продолжать создавать доменно-ориентированные методы для каждого конкретного случая с простыми аргументами.   -  person Viktor Stolbin    schedule 17.07.2012


Ответы (1)


Да, это возможно. Ваш список ограничений должен быть обычным списком объектов Criterion (т. е. списком ‹Criterion>). Просто для ясности: если вы добавите их все, как в своем примере кода, вы будете выполнять конъюнкцию (серию логических И).

Добавление моего предложения в ваш код дает следующее:

Public List<myPojoClass> getDataByCriterion( List<Criterion> restrictionList) {
Session s = HibernateUtil.currentSession();
Criteria c = s.createCriteria(myPojo.class);
for (Criterion crit : restrictionList){
    c.add(crit);
}

List<myPojoClass> response = c.list();
person Andre    schedule 17.07.2012
comment
Спасибо, похоже, это то, что мне нужно. Но как мне создать объекты Criterion. - person JJRutter; 17.07.2012
comment
@JJRutter Статические методы в org.hibernate.criterion.Restrictions возвращают множество различных реализаций Criterion. - person Mikko Maunu; 17.07.2012
comment
У них есть всевозможные реализации Criterion... взгляните на доступные, их должно быть достаточно для большинства случаев. В тех случаях, когда вам нужно реализовать свой собственный, это просто вопрос реализации интерфейса Criterion. Я делал это в прошлом, когда мне нужно было выполнить текстовый поиск в полях даты; вот как это сделать, если вам интересно: stackoverflow.com/a/10799592/323807 - person Andre; 17.07.2012
comment
Да, есть все типы реализации критериев. Тем не менее, я бы придерживался фабричных методов класса Restrictions, если только вам не нужно делать что-то, что он не может сделать. - person Matt; 18.07.2012
comment
@Matt Я на самом деле имел в виду, что у фабрики ограничений есть всевозможные реализации; они протестированы и, насколько я знаю, работают на большинстве двигателей. Так что да, вы должны сделать все возможное, чтобы придерживаться их. Но я просто хотел указать, что вы не должны чувствовать себя ограниченными реализацией на фабрике ограничений. В моем случае, например, мне нужен был текстовый поиск по дате поля. Вы можете сделать это с ограничением sql из Restriction factory, но вы будете уязвимы для SQL-инъекций. - person Andre; 18.07.2012