Проверка кода IntelliJ IDEA: пользовательский диалект HQL и зарегистрированные функции

Мой вопрос о

  1. использование зарегистрированных функций для манипулирования датой и временем в Hibernate Query Language и
  2. Проверка кода 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. В идеале, если кто-то может предложить лучший путь, чем создание нового подкласса диалекта, это было бы здорово.

0 ответов

Другие вопросы по тегам