Skip to content

NPE in HqlQueryTransformer.isSubquery for UPDATE HQL #3649

@dforrest-es

Description

@dforrest-es

With 3.2.11, repository initialization fails with

Caused by: java.lang.NullPointerException: Cannot invoke "org.antlr.v4.runtime.ParserRuleContext.getParent()" because "ctx" is null
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.isSubquery(HqlQueryTransformer.java:105) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryTransformer.visitVariable(HqlQueryTransformer.java:362) ~[spring-data-jpa-3.2.11.jar:3.2.11]
	at org.springframework.data.jpa.repository.query.HqlQueryRenderer.visitVariable(HqlQueryRenderer.java:1) ~[spring-data-jpa-3.2.11.jar:3.2.11]

Issue is very similar to #2977 but for update clauses:

update MyEntityStaging AS mes
set mes.col = 'test'
where mes.id = 1

Entity:

@Entity
@NamedQuery(name = "MyEntity.updateCol", query = """
        update MyEntity AS mes
        set mes.col = 'test'
        where mes.id = 1
""")
class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    private String col;
}

Repository:

interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    @Modifying
    @Transactional
    void updateCol();
}

Reproducer:
demo.zip
Extract and run ./mvnw spring-boot:run to observe the exception.
In the pom.xml, change the spring-data-jpa.version from 3.2.11 to 3.2.10 and run again, now it works.


My investigation:

Specifically, this change causes HqlQueryTransformer#isSubquery(ParserRuleContext) to be run for update clauses & likely needs the same fix from #2977 applied for HqlParser.UpdateStatementContext (see commit 6b9d3e2)

Wrokaround:
Removing the AS from the table alias bypass this error.

Metadata

Metadata

Labels

type: regressionA regression from a previous release

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions