Динамический запрос к нескольким свойствам с Hibernate - PullRequest
3 голосов
/ 12 августа 2010

У меня есть модель, которая имеет несколько свойств.Свойства могут быть примитивными (String) или сложными (Object).Пользователь может сделать запрос для каждого примитивного свойства.Я хотел бы знать, есть ли простой способ динамически построить запрос.Я использую Java и Hibernate.

Модель

public class Model {
  String prop1;
  Point prop2;
  List<Shape> prop3;
}

Point и Shape являются объектами, которые могут содержать примитивы или объекты.Примером запроса могут быть все случаи, когда prop1 = "A" и координаты x = 3 и y = 8, а одна из фигур представляет собой круг.

prop1 = "A" и prop2.x= 3 и prop2.y и prop3.get (i) .type = "Circle";нам пришлось бы повторять все экземпляры prop3.

Моя первая идея была недостижимой и неэффективной.Он состоит в выполнении запросов ко всем примитивным свойствам, а затем объединении результатов.

  • Получить все случаи, когда prop1 = "A"
  • Получить все случаи, где prop2.x = 3prop3 = y;
  • Получить все случаи, когда один из Shape.type = "Circle";
  • Получить пересечение всех 3 наборов

Есть лиСуществующая библиотека или алгоритм, который может решить эту проблему лучше (умнее)?

Спасибо

1 Ответ

2 голосов
/ 12 августа 2010

Вы смотрели на Критерии запросов ?Это функция Hibernate для программного создания запросов и параметров.

Если вы собираетесь запрашивать объекты, соответствующие всем этим условиям:

prop1 = "A" и prop2.x= 3 и prop2.y и prop3.get (i) .type = "Circle"

с поддержкой запросов на сопоставление , тогда вы можете сделать что-то вроде

Criteria criteria = session.createCriteria(Model.class);
criteria.add(Restrictions.eq("prop1", "A"));
criteria.createCriteria("prop2")
    .add(Restrictions.eq("x", 3));
    .add(Restrictions.eq("y", 2));
criteria.createCriteria("prop3").add(Restrictions.in("type", "Circle"));

List results = criteria.list();

Реальная сила запросов Criteria заключается в построении запроса в коде, а не в строке HQL - позволяет динамически добавлять / устанавливать свойства и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...