Функция подсчета в HQL, приводящая к нулевым результатам? - PullRequest
1 голос
/ 28 августа 2009

У меня есть следующий HQL-запрос, который пытается вернуть 2 экземпляра объекта, а также совокупный счет на основе 3-го экземпляра объекта.

SELECT
    client,
    clientCampaign,
    count( formData )
FROM
    FormData as formData
    JOIN formData.deliveryResults as deliveryResults
    JOIN formData.leadForm as leadForm
    JOIN leadForm.campaignForms as campaignForms
    JOIN campaignForms.clientCampaignForms.clientCampaign as clientCampaign
    JOIN clientCampaign.client as client
WHERE
    client.id = ?
GROUP BY
    client.id, clientCampaign.id

Результаты всегда возвращаются с экземпляром clientCampaign, равным нулю. Однако если я удалю строку count (formData) из предложения SELECT, экземпляр clientCampaign больше не будет иметь значение null. Я проверил набор данных, и всего существует 5 записей formData ... 3 для одной clientCampaign и 2 для другой. Поэтому я считаю, что этот запрос должен возвращать 2 результата, оба с ненулевыми экземплярами clientCampaign.

Кто-нибудь может сказать, есть ли что-то очевидное, что я здесь упускаю?

ТИА

Ответы [ 2 ]

0 голосов
/ 30 августа 2009

Перед другими комментариями мне нравится, как вы сначала представляете свой HQL-запрос с каждым JOIN в отдельной строке. Это очень читабельно. Я предлагаю вам выполнить рефакторинг clientCampaign таким же образом, даже если вы не используете псевдонимы ... Это также может изменить некоторые результаты (кто знает, какой код может быть запущен во внутренностях Hibernate с вашим исходным запросом!?).

Вы, кажется, запрашиваете перемещение между таблицами, идущими вверх и вниз (судя по именам, если они заканчиваются на 's' или нет). Это немного трудно читать. Возможно, вам и нам будет проще перейти на один ордер (например, идти вниз, начиная с leadForm). В частности, мы могли бы обнаружить другие «объединения» и рассмотреть их более тщательно (я подозрительно на clientCampaignForms.clientCampaign ...)

0 голосов
/ 28 августа 2009
  1. Можете ли вы опубликовать сопоставления ваших объектов? Без них трудно сказать, но кажется (судя по именам), что вы идете вверх по иерархии (от коллекции к владельцу), а не вниз, что несколько неестественно при использовании Hibernate.

  2. JOIN formData.deliveryResults as deliveryResults не требуется (нигде не используется). Большинство других объединений также могут быть ненужными - для сопоставлений «один к одному» свойства можно записывать с использованием вложенных точечных обозначений без явных объединений.

  3. В предложении GROUP BY перечислены только идентификаторы, а вы выбираете полные сущности (client и clientCampaign). Это не сработает - вы должны явно перечислить поля для группировки по .

В зависимости от ваших сопоставлений, вы можете переписать этот запрос, используя соединения типа «родитель-ребенок»; Вы можете использовать функцию size() в своей коллекции deliveryResults без необходимости GROUP BY.

...