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,

我的问题是关于

  • 在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, 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.