Hibernate OO Дизайн Вопрос - PullRequest
       14

Hibernate OO Дизайн Вопрос

1 голос
/ 04 декабря 2009

Я работаю над созданием механизма запросов Hibernate, который может создавать динамические запросы. До сих пор я использовал Criterion API для генерации запросов. Мне трудно писать движок в оригинальном стиле. Я хочу иметь возможность создать новый класс для каждой ассоциации и передать ему фрагмент вызова SQL.

Например:

Человек может иметь дом, машину и лодку.

Я хочу, чтобы пользователь мог искать "Вернуть любого человека, у которого есть синий дом и красная лодка" У меня есть карта searchTerm, которая выглядит так:

home.color = blue

boat.color = red

Я бы хотел, чтобы по одному критерию для каждого критерия (лодка, машина, дом) я мог передать всю карту, и он возвращает мне объект Criteria, который я могу использовать для построения своего запроса. Это теория. Проблема, с которой я сталкиваюсь, заключается в том, что в Hibernate мне нужно создать критерии или псевдоним, чтобы связать человека с лодкой / домом / автомобилем. Чтобы сделать это, я должен перейти в сеанс гибернации. Что я действительно хочу, так это иметь возможность вернуть отдельные критерии и объединить их все вместе. Но, похоже, это не способ сделать это.

В итоге: Класс, который возвращает объект критерия, который создает ассоциации без объекта сеанса.

Есть мысли?

Спасибо за чтение!

1 Ответ

3 голосов
/ 04 декабря 2009

И DetachedCriteria у вас не работает, потому что?

Обновление (на основе комментария)

Как создать разные объекты различные отдельные критерии и слияния они все вместе в одном запросе?

Вы не «сливаете» их. В вашем примере Person - это корневая сущность (потому что вы ищете пользователей; плюс она имеет ассоциации со всеми другими сущностями, такими как House, Boat, Car). Таким образом, вы будете изначально создавать критерии для Person:

DetachedCriteria personCriteria = DetachedCriteria.forClass(Person.class);

, а затем, в зависимости от ваших условий, при необходимости создайте ассоциацию:

// this assumes that "Boat" is mapped as many-to-one "boat" property on "Person"
DetachedCriteria boatCriteria = personCriteria.createCriteria("boat");
boatCriteria.add(Restriction.eq("color", "red"));

// same for house
DetachedCriteria houseCriteria = personCriteria.createCriteria("house");
houseCriteria.add(Restriction.eq("color", "blue"));

// when you're all done you search based on "personCriteria"
personCriteria.getExecutableCriteria(session).list();

Кстати, вы можете взглянуть на проект Hibernate Generic DAO , в частности на его компонент Search , который в основном является Criteria API.

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