Java IntelliJ IDEA代码检查:HQL自定义方言&;注册函数
我的问题是关于Java IntelliJ IDEA代码检查:HQL自定义方言&;注册函数,java,hibernate,intellij-idea,hql,code-inspection,Java,Hibernate,Intellij Idea,Hql,Code Inspection,我的问题是关于 在Hibernate查询语言和 IntelliJ IDEA对HQL中这些注册函数的代码检查 我使用Hibernate4.2.5和Java7,SQLServer2008R2作为数据库,IntellijIDEA 12.1.6 在HQL查询中,我需要执行TSQL DATEADD函数或等效的HQL date操作。这似乎不存在 以下是我想要实现的目标: update MyTable set startTime = GETDATE(), targetTime = DATEADD(HOUR,
update MyTable set startTime = GETDATE(), targetTime = DATEADD(HOUR, allocatedTime, GETDATE()), endTime = null where faultReport.faultReportId = :faultReportId and slaTypeId = :slaTypeId
令人失望的是,在线搜索答案没有任何帮助,最常见的建议(如此处的评论:)似乎是“不要在hql中使用日期操纵”。在一般情况下,我不知道如何在SQL语句中执行该操作(例如,当您希望根据多行中另一列的值更新一列时)
与本文中的建议类似,我对SQLServer方言实现进行了子类化,并注册了新函数:
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,", ",", ")"));
并将此属性添加到my persistence.xml:
<property name="hibernate.dialect" value="my.project.dialect.SqlServerDialectExtended" />
函数似乎已成功注册,并且该查询似乎正在运行,因为生成了以下SQL且结果正确:
select
faultrepor0_.FaultReportSLATrackingId as col_0_0_,
GETDATE() as col_1_0_,
DATEADD(HOUR,
1,
GETDATE()) as col_2_0_,
... etc.
但是我现在对IntelliJ IDEA有一个问题:在HQL中使用get_date()时,代码检查会抱怨“expected,get')”。这被标记为错误,文件以红色标记为编译失败
请有人解释一下如何处理这个问题,或者解释一下什么是更好的方法?我是否使用了错误的SQLFunction模板(VarArgsSQLFunction)?如果是,哪一个是最好的
我不希望在IDE中将注册函数的用法标记为无效。理想情况下,如果有人能提出一个比创建一个新的方言子类更好的方法,那就太棒了。Update:Problem solved。事实证明,解决这个问题非常简单:将插入符号放在HQL/JPQL/TSQL等上,按Alt+Enter,然后选择“语言注入设置”。您可以在出现的对话框中选择一种语言。将删除此问题,但可能会帮助其他人在将来搜索相同的建议。。
select
faultrepor0_.FaultReportSLATrackingId as col_0_0_,
GETDATE() as col_1_0_,
DATEADD(HOUR,
1,
GETDATE()) as col_2_0_,
... etc.