Uploaded image for project: 'Tools (JBoss Tools)'
  1. Tools (JBoss Tools)
  2. JBIDE-12297

Infinite loop in JPA Validator with HQL syntax Query

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Do
    • Icon: Major Major
    • 4.0.x
    • 4.0.0.Alpha1
    • hibernate, upstream
    • None
    • Hide

      An entity class with the indicated named query present in a JPA persistence project.

      Show
      An entity class with the indicated named query present in a JPA persistence project.

      Expect to get a warning about the (invalid) HQL syntax. Actually behaviour makes eclipse unresponsive.

      An Infinite loop in JPA AbstractExpression parse method when using hibernate syntax FromClause.

      wordParser contains the text: OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId WHERE ro.ownerId = :ownerId

      Uses the hibernate WITH clause.

      Eclipse becomes unresponsive and has high CPU usage.

      breaking the running instance and checking paused threads get a loop around the following stack trace:

      Thread [Worker-3] (Suspended)
      FromClause(AbstractExpression).parse(WordParser, String, boolean) line: 748
      FromClause(AbstractFromClause).parse(WordParser, boolean) line: 191
      SelectStatement(AbstractSelectStatement).parse(WordParser, boolean) line: 348
      SelectStatement.parse(WordParser, boolean) line: 238
      SelectStatementFactory.buildExpression(AbstractExpression, WordParser, String, JPQLQueryBNF, AbstractExpression, boolean) line: 55
      JPQLExpression(AbstractExpression).parse(WordParser, String, ExpressionFactory, JPQLQueryBNF, AbstractExpression, boolean) line: 983
      JPQLExpression(AbstractExpression).parseSingleExpression(WordParser, String, boolean) line: 1004
      JPQLExpression.parse(WordParser, boolean) line: 307
      JPQLExpression.<init>(CharSequence, JPQLGrammar, String, boolean) line: 129
      JPQLExpression.<init>(CharSequence, JPQLGrammar, boolean) line: 91
      DefaultJPQLQueryContext(JPQLQueryContext).initializeRoot() line: 700
      DefaultJPQLQueryContext(JPQLQueryContext).setQuery(IQuery) line: 808
      GenericJpaJpqlQueryHelper(AbstractJPQLQueryHelper).setQuery(IQuery) line: 435
      GenericJpaJpqlQueryHelper(JpaJpqlQueryHelper).setQuery(NamedQuery, String) line: 223
      GenericJpaJpqlQueryHelper(JpaJpqlQueryHelper).validate(NamedQuery, String, TextRange, int, List<IMessage>) line: 270
      GenericJavaNamedQuery2_0.validateQuery_(JpaJpqlQueryHelper, List<IMessage>, IReporter) line: 112
      GenericJavaNamedQuery2_0(AbstractJavaQuery<A>).validateQuery(JpaJpqlQueryHelper, List<IMessage>, IReporter, CompilationUnit) line: 226
      GenericJavaNamedQuery2_0(AbstractJavaQuery<A>).validate(JpaJpqlQueryHelper, List<IMessage>, IReporter, CompilationUnit) line: 197
      GenericPersistenceUnit(AbstractPersistenceUnit).validate(Query, JpaJpqlQueryHelper, List<IMessage>, IReporter) line: 2615
      GenericPersistenceUnit(AbstractPersistenceUnit).validateQueries(List<IMessage>, IReporter) line: 2559
      GenericPersistenceUnit(AbstractPersistenceUnit).validate(List<IMessage>, IReporter) line: 2249
      GenericPersistence.validatePersistenceUnit(List<IMessage>, IReporter) line: 320
      GenericPersistence.validate(List<IMessage>, IReporter) line: 272
      GenericPersistenceXml.validate(List<IMessage>, IReporter) line: 281
      GenericRootContextNode.validate(List<IMessage>, IReporter) line: 244
      GenericJpaProject(AbstractJpaProject).validate(List<IMessage>, IReporter) line: 1491
      GenericJpaProject(AbstractJpaProject).getValidationMessages(IReporter) line: 1481
      InternalJpaProjectManager.buildValidationMessages_(IProject, IReporter) line: 553
      InternalJpaProjectManager$BuildValidationMessagesCommand.execute() line: 542
      CommandJobCommandAdapter.execute(IProgressMonitor) line: 39
      JobCommandJob.run(IProgressMonitor) line: 42
      Worker.run() line: 54

      Class being parsed looks like:

      @Entity
      @Table(name="ResourceOwner")
      @NamedQueries(

      { // NB: This is an HQL query as it uses the Hibernate conditional JOIN syntax ie WITH condition @NamedQuery(name = "FindResourceOwnerAndGrantsForROIdandClientId", query = "SELECT ro,gr FROM ResourceOwner ro LEFT OUTER JOIN ro.grants gr LEFT OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId WHERE ro.ownerId = :ownerId"), @NamedQuery(name = "FindResourceOwnerAndGrantsForROIdandClientIdAndScopes", query = "SELECT ro,gr FROM ResourceOwner ro LEFT OUTER JOIN ro.grants gr WITH gr.scopeId IN :scopes LEFT OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId WHERE ro.ownerId = :ownerId"), }

      )
      public class ResourceOwner implements Serializable {
      ...

              dgeraskov Dmitry Geraskov (Inactive)
              icarr_jira Ian Carr (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: