Запрос критериев гибернации - PullRequest
2 голосов
/ 13 января 2011

Я пытаюсь выполнить подзапрос с использованием API-критериев Hibernate, но не смог полностью выяснить, как это сделать. Предполагая, что есть 2 таблицы, SHOPS и СОТРУДНИКИ, где SHOPS имеет всю информацию о магазинах, а СОТРУДНИКИ - это большая таблица всей занятости во всех магазинах (без внешних ключей). Я пытаюсь написать запрос, который извлекает идентификатор магазина и адрес из таблицы SHOPS, а затем получает число занятых в магазине по объединению и рассчитывает на таблицу EMPLOYEES. Примерно так:

SELECT a.SHOP_ID, a.SHOP_ADDRESS, (SELECT COUNT(*) FROM
SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID) as NUM_EMPLOYEES FROM   <--Problem here
SHOPS a
WHERE
QUERY_STATUS ='Open'

Итак, у меня есть класс Java с ShopId, shopAddres, numEmployees и аналогичными для сотрудников.

Мой подзапрос:

DetachedCriteria subquery = DetachedCriteria.forClass(
  Employee.class, "b").add(
  Property.forName("b.shopId").eqProperty("a.shopId"))
  .setProjection(
    Projections.projectionList().add(
      Projections.rowCount()));

И основной критерий запроса по строкам:

List shopListRet = session.createCriteria(Shop.class, "a")
  .setProjection(
    Projections.projectionList().add(
      Projections.property("a.shopId"))).add(Subquery..."DONT KNOW WHAT SHOULD COME HERE").list();

Мой вопрос:

  • Как связать запрос Detached как подзапрос для сбора результата подсчета в переменной класса numEmployees в классе Shop?

Спасибо -J

1 Ответ

4 голосов
/ 13 января 2011

Используйте проекцию SQL для добавления подзапроса.

  String subSql = "SELECT COUNT(*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID"
...
    .add( Projections.sqlProjection(
        subSql ,
        new String[] { "NUM_EMPLOYEES" },
        new Type[] { Hibernate.LONG }
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...