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

Infinite loop in JPA Validator with HQL syntax Query


    • Type: Bug
    • Status: Closed (View Workflow)
    • Priority: Major
    • Resolution: Won't Fix
    • Affects Version/s: 4.0.0.Alpha1
    • Fix Version/s: 4.0.x
    • Component/s: hibernate, upstream
    • Labels:
    • Steps to Reproduce:

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

      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:


      { // 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 {

        Gliffy Diagrams




              • Assignee:
                dgeraskov Dmitry Geraskov
                icarr Ian Carr
              • Votes:
                0 Vote for this issue
                4 Start watching this issue


                • Created: