Проверка кода IntelliJ IDEA: пользовательский диалект HQL и зарегистрированные функции
Мой вопрос о
- использование зарегистрированных функций для манипулирования датой и временем в Hibernate Query Language и
- Проверка кода IntelliJ IDEA для этих зарегистрированных функций в HQL.
Я использую Hibernate 4.2.5 с Java 7, SQL Server 2008 R2 в качестве базы данных и IntelliJ IDEA 12.1.6.
В запросе HQL мне нужно выполнить функцию TSQL DATEADD - или эквивалентную операцию даты HQL. Кажется, этого не существует.
Вот чего я хотел бы достичь:
update MyTable set startTime = GETDATE(), targetTime = DATEADD(HOUR, allocatedTime, GETDATE()), endTime = null where faultReport.faultReportId = :faultReportId and slaTypeId = :slaTypeId
Поиск ответов в Интернете, к сожалению, не помог, и наиболее распространенный совет (например, комментарий, который можно посмотреть здесь: /questions/21844421/funktsiya-sql-v-operatore-vstavki-hibernate/21844426#21844426), по-видимому, "не используйте манипуляции с датой в hql". Я не понимаю, как можно обойти выполнение операции в операторе SQL в общем случае (например, когда вы хотите обновить один столбец на основе значения в другом столбце в нескольких строках).
Аналогично совету в этом посте: операции с датами в HQL, я подклассифицировал реализацию SQLServerDialect и зарегистрировал новые функции:
registerFunction("get_date", new NoArgSQLFunction("GETDATE", StandardBasicTypes.TIMESTAMP)); // this function is a duplication of "current_timestamp" but is here for testing / illustration
registerFunction("add_hours", new VarArgsSQLFunction(TimestampType.INSTANCE, "DATEADD(HOUR,", ",", ")"));
и добавил это свойство в мой файл persistence.xml:
<property name="hibernate.dialect" value="my.project.dialect.SqlServerDialectExtended" />
и затем я тестирую с простым (бессмысленным, допустимым) запросом, подобным этому:
select x, get_date(), add_hours(1, get_date()) from MyTable x
Кажется, что функции успешно зарегистрированы, и этот запрос, кажется, работает, потому что генерируется следующий SQL и результаты верны:
select
faultrepor0_.FaultReportSLATrackingId as col_0_0_,
GETDATE() as col_1_0_,
DATEADD(HOUR,
1,
GETDATE()) as col_2_0_,
... etc.
Но теперь у меня есть эта проблема с IntelliJ IDEA: там, где get_date() используется в HQL, проверка кода выдает "
Может кто-нибудь объяснить, как с этим бороться, или объяснить, что лучше? Я использую неправильный шаблон SQLFunction (VarArgsSQLFunction)? Если да, какой из них лучше всего использовать?
Я хотел бы, чтобы использование зарегистрированной функции не было помечено как недопустимое в моей среде IDE. В идеале, если кто-то может предложить лучший путь, чем создание нового подкласса диалекта, это было бы здорово.