IntelliJ + Spring:如何在HQL查询中启用表名检查?

时间:2016-12-19 21:32:28

标签: spring hibernate jpa intellij-idea

我在我的项目中使用Spring Boot 1.4.2以及Hibernate和JPA。我使用IntelliJ Community 2016.2.4,和我的同事一样。不同之处在于,当他在HQL中输入内容时(即@Query(“SELECT id FROM usesrs”))它会根据真实的数据库结构自动检查表名 - 没有“使用者”表,但是有一个“用户”表所以他的项目不会编译,除非他纠正它 - 这是一个多么美妙的功能!有时我需要花很多时间来发现这些错误......

你能告诉我如何在IntelliJ中启用它吗?我尝试了什么:

1)当我转到Preferences / Editor / Language injections / "+" sign / Java Parameter时,我没有在列表中看到SQL,也没有谈到HQL(但是JQL是疯狂的......)。无论如何看起来我想要启用比纯语法检查更深层次的东西,它必须检查数据库结构。

2)当我去File / Project structure / Facets / "+" sign时,我没有看到JPA,只有一些Android选项和Java-Gradle。

这里有什么建议吗?

3 个答案:

答案 0 :(得分:2)

Ultimate版本支持不幸的JPA / Hibernate功能。

enter image description here

IDEA有语言注入,它可以将一种语言(例如SQL,RegExp,XML,HTML,CSS等)注入代码中的字符串文字中,从而获得编辑该文字时的综合编码帮助。

您可以在here

获得帮助Using language injections in SQL和提示

答案 1 :(得分:1)

在数据库视图中是您的数据源设置吗?

如果尚未显示,请转到查看 - >工具Windows - >数据库

您应该会看到连接的数据源。

如果不存在,则需要使用+ - >进行设置。 "数据源"然后选择您使用的数据库并设置连接。

完成此操作后,或者如果已经存在数据库连接,您将要使用"刷新"来同步数据源。在数据库视图中查找图标。

然后单击更多模式并选择您使用的模式,并点击同步。 Intellij现在应该知道DB和你的表结构。

希望它可以自动检查您的查询,除非有其他不妥之处。

答案 2 :(得分:1)

关于这个主题的三个结论:

1)正如@Liping Huang指出的那样,实时检查(我想错误的高位)仅限于终极版

2)我更深入地研究了这个问题,看起来我实际上已经对此有一些基本的支持,但我只是忽略了隐藏在堆栈中较低的错误信息。在社区中我必须尝试运行应用程序,因此没有实时突出显示。然后,如果表名中有错误,则消息将在堆栈跟踪中。

以下是示例,请注意“Usesrs未映射”消息:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'protectedController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRepositoryImpl': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract void com.ekinnolab.database.repository.user.userRepository.setAsDeletedById(java.lang.Long)!
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:592) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE]
(…)

//    cutting out 150 about lines
(...)
        at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
        at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
        ... 69 common frames omitted
 HERE ==> Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Usesrs is not mapped
            at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:171) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:76) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:321) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3687) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3576) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:716) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:373) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:265) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
            ... 77 common frames omitted

3)BTW,对于纯SQL,有一些有趣的插件。只需转到IntelliJ IDEA / Preferences / Plugins / Browse repositories。 “SQL查询插件”是那些看起来很有希望的人之一。