Вы используете Найденные выражения CASE , но ваш синтаксис неправильный.
Правильный синтаксис:
CASE [ WHEN {test_conditional} THEN {match_result} ]* ELSE {miss_result} END
Если вы измените свой запрос на то, что яПриведенный здесь, он, по крайней мере, анализируется без каких-либо исключений:
import antlr.RecognitionException;
import antlr.TokenStreamException;
import org.hibernate.hql.internal.ast.HqlParser;
public class Main {
public static void main(String[] args) throws TokenStreamException, RecognitionException {
HqlParser parser = HqlParser.getInstance("select f from StudentFee f inner join f.studentFeeDetails d left outer join d.feeReceiptDetails r inner join f.student s inner join s.studyHistoryList h inner join h.academicYear a where a.id in (:academicYearId) and ( case when year(a.startDate) = year(a.endDate) then case when f.month >= month(a.startDate) and f.month <= month(a.endDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate) then TRUE else FALSE end end or case when year(a.endDate) >= year(a.startDate) and f.month <= month(a.endDate) and f.month >= month(a.startDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate) then TRUE else FALSE end ) group by f.id having ( sum(r.amountPaid) < sum(d.feeAmount) or sum(r.amountPaid) = null ) and str_to_date( concat(:feeDueDay,'-',f.month,'-',f.year), '%d-%m-%Y' ) < CURRENT_DATE");
parser.statement();
}
}
Однако логика в ваших исходных выражениях не выглядит правильной:
case when year(a.startDate) = year(a.endDate)
then
f.month >= month(a.startDate)
and
f.month <= month(a.endDate)
and
f.year >= year(a.startDate)
and
f.year <= year(a.endDate)
end
or
case when year(a.endDate) >= year(a.startDate)
then
f.month <= month(a.endDate)
and
f.month>= month(a.startDate)
and
f.year >= year(a.startDate)
and
f.year <= year(a.endDate)
end
Вы имели в видуэто вместо этого?
case when year(a.startDate) = year(a.endDate)
then
case when f.month >= month(a.startDate) and f.month <= month(a.endDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate)
then
TRUE
else
FALSE
end
end
or
case when year(a.endDate) >= year(a.startDate) and f.month <= month(a.endDate) and f.month >= month(a.startDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate)
then
TRUE
else
FALSE
end
Также в следующий раз довольно распечатайте ваши фрагменты кода (сейчас это запрос шириной более 700 символов - его нелегко читать).
Существует множество инструментов, которые выможно использовать для печати ваших запросов.Например, модифицированный запрос, который я предоставил, на самом деле выглядит довольно примерно так:
select f from StudentFee f
inner join f.studentFeeDetails d
left outer join d.feeReceiptDetails r
inner join f.student s
inner join s.studyHistoryList h
inner join h.academicYear a
where
a.id in (:academicYearId)
and
(
case when year(a.startDate) = year(a.endDate)
then
case when f.month >= month(a.startDate) and f.month <= month(a.endDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate)
then
TRUE
else
FALSE
end
end
or
case when year(a.endDate) >= year(a.startDate) and f.month <= month(a.endDate) and f.month >= month(a.startDate) and f.year >= year(a.startDate) and f.year <= year(a.endDate)
then
TRUE
else
FALSE
end
)
group by f.id
having (
sum(r.amountPaid) < sum(d.feeAmount)
or
sum(r.amountPaid) = null
)
and
str_to_date(
concat(:feeDueDay,'-',f.month,'-',f.year), '%d-%m-%Y'
) < CURRENT_DATE