Это было опубликовано на форуме Hibernate несколько лет назад, когда его спросили о том, почему это сработало в Hibernate 2, но не в Hibernate 3:
Предел был never поддерживаемое предложение в HQL. Вы должны использовать setMaxResults ().
blockquote>Так что если он работал в Hibernate 2, кажется, это было по совпадению, а не по дизайну. Я думаю, что это было потому, что парсер Hibernate 2 HQL заменил бит запроса, который он распознал как HQL, и оставил все остальное как есть, чтобы вы могли прокрасться в какой-то собственный SQL. Hibernate 3, однако, имеет правильный алгоритм AST HQL, и он намного менее прощает.
Я думаю, что
Query.setMaxResults()
действительно является вашим единственным вариантом.
Если вы хотите избавиться от UNION
, вы можете использовать агрегированный запрос с выражением CASE
для декодирования marke
.
SELECT
CASE
WHEN a1 = 1 THEN 'Mercedes'
WHEN a2 = 1 THEN 'BMW'
WHEN a3 = 1 THEN 'Ford'
END AS marke,
COUNT(autos.id)
FROM autos
WHERE a1 = 1 OR a2 = 1 OR a3 = 1
GROUP BY a1, a2, a3