Заказ по условию HQL - PullRequest
       19

Заказ по условию HQL

0 голосов
/ 28 марта 2012

У меня есть следующие таблицы:

SN, D и C со следующими ссылками:

SN содержит FK к D (d_id) (ManyToOne), SN содержит FK к C(c_id) (OneToOne), C имеет FK-D (d_id, OneToOne).D также содержит (среди других столбцов String number и String name).

Теперь у меня есть HQL-запрос, подобный следующему: "from SN sn where (sn.d is not null or sn.c.d is not null)" (Итак, если sn.d равен нулю,d от sn.cd).Этот набор, однако, должен сортироваться по d.number или d.name.Поскольку во время создания запроса мы не знаем, по какой из «d» отсортировать, я пробовал так: "from SN sn where (sn.d is not null or sn.c.d is not null) order by coalesce (sn.d.name, sn.c.d.name)", но это не работает, я получаю меньше результатов, чем при обычном выборе;Я также пробовал с "order by case when sn.d is not null then sn.d.name else sn.c.d.name", но с тем же результатом.

Как я могу заказать по другому столбцу, если первый в HQL нулевой?

Спасибо

1 Ответ

1 голос
/ 28 марта 2012

Полагаю, проблема в том, что с вашим выражением sn.d.name вы заставляете hibernate для внутреннего объединения таблиц SN и D, в результате чего вы не получаете строки, где sn.d равен нулю, даже если sn.cd равен нулю , То же самое для sn.c.d.name.

Попробуйте явно определить соединение между SN и D как внешнее соединение, что-то вроде этого: from SN sn outer join D d inner join C c where (sn.d is not null or sn.c.d is not null) order by coalesce (d.name, c.d.name)

В целях отладки я рекомендую установить <property name="show_sql">true</property> в файле hibernate.cfg.xml. Затем вы можете проверить, что не так с оператором hibernate, созданным из вашего кода, или проверить мое предложение (которое я не проверял, оно может быть не на 100% правильным).

...