Skip to content

Commit 99ade22

Browse files
authored
Enable validation for queries inside JDBC query annotation (#1806)
Signed-off-by: BoykoAlex <alex.boyko@broadcom.com>
1 parent 3ebe5e9 commit 99ade22

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/QueryJdtAstReconciler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024, 2025 Broadcom, Inc.
2+
* Copyright (c) 2024, 2026 Broadcom, Inc.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -117,7 +117,8 @@ private Reconciler getQueryReconciler(IJavaProject project) {
117117

118118
@Override
119119
public boolean isApplicable(IJavaProject project) {
120-
return SpringProjectUtil.hasDependencyStartingWith(project, "spring-data-jpa", null);
120+
return SpringProjectUtil.hasDependencyStartingWith(project, "spring-data-jpa", null)
121+
|| SpringProjectUtil.hasDependencyStartingWith(project, "spring-data-jdbc", null);
121122
}
122123

123124
@Override

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/QueryReconcilerTest.java

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,92 @@ public interface OwnerRepository {
290290
editor.assertProblems("SELECTX|HQL: mismatched input 'SELECTX'");
291291
}
292292

293+
@Test
294+
void jdbcQueryNoErrors() throws Exception {
295+
String source = """
296+
package example.demo;
297+
298+
import org.springframework.data.jdbc.repository.query.Query;
299+
import org.springframework.data.repository.CrudRepository;
300+
301+
public interface OwnerRepository extends CrudRepository<Object, Integer> {
302+
303+
@Query("SELECT * FROM owner WHERE last_name = :lastName")
304+
List<Object> findByLastName(String lastName);
305+
306+
}
307+
""";
308+
String docUri = directory.toPath().resolve("src/main/java/example/demo/OwnerRepository.java").toUri()
309+
.toString();
310+
Editor editor = harness.newEditor(LanguageId.JAVA, source, docUri);
311+
editor.assertProblems();
312+
}
313+
314+
@Test
315+
void jdbcQueryErrorReported() throws Exception {
316+
String source = """
317+
package example.demo;
318+
319+
import org.springframework.data.jdbc.repository.query.Query;
320+
import org.springframework.data.repository.CrudRepository;
321+
322+
public interface OwnerRepository extends CrudRepository<Object, Integer> {
323+
324+
@Query("SELECTX * FROM owner WHERE last_name = :lastName")
325+
List<Object> findByLastName(String lastName);
326+
327+
}
328+
""";
329+
String docUri = directory.toPath().resolve("src/main/java/example/demo/OwnerRepository.java").toUri()
330+
.toString();
331+
Editor editor = harness.newEditor(LanguageId.JAVA, source, docUri);
332+
editor.assertProblems("SELECTX|MySQL: mismatched input 'SELECTX' expecting {'ALTER',");
333+
}
334+
335+
@Test
336+
void jdbcQueryNormalAnnotationErrorReported() throws Exception {
337+
String source = """
338+
package example.demo;
339+
340+
import org.springframework.data.jdbc.repository.query.Query;
341+
import org.springframework.data.repository.CrudRepository;
342+
343+
public interface OwnerRepository extends CrudRepository<Object, Integer> {
344+
345+
@Query(value = "SELECTX * FROM owner WHERE last_name = :lastName")
346+
List<Object> findByLastName(String lastName);
347+
348+
}
349+
""";
350+
String docUri = directory.toPath().resolve("src/main/java/example/demo/OwnerRepository.java").toUri()
351+
.toString();
352+
Editor editor = harness.newEditor(LanguageId.JAVA, source, docUri);
353+
editor.assertProblems("SELECTX|MySQL: mismatched input 'SELECTX' expecting {'ALTER',");
354+
}
355+
356+
@Test
357+
void jdbcOnlyProjectNoReconcilingWithoutDbConnector() throws Exception {
358+
directory = new File(ProjectsHarness.class.getResource("/test-projects/aot-data-repositories-jdbc/").toURI());
359+
String projectDir = directory.toURI().toString();
360+
projectFinder.find(new TextDocumentIdentifier(projectDir)).get();
361+
362+
String source = """
363+
package example.demo;
364+
365+
import org.springframework.data.jdbc.repository.query.Query;
366+
import org.springframework.data.repository.CrudRepository;
367+
368+
public interface OwnerRepository extends CrudRepository<Object, Integer> {
369+
370+
@Query("SELECTX * FROM owner")
371+
List<Object> findAll();
372+
373+
}
374+
""";
375+
String docUri = directory.toPath().resolve("src/main/java/example/demo/OwnerRepository.java").toUri()
376+
.toString();
377+
Editor editor = harness.newEditor(LanguageId.JAVA, source, docUri);
378+
editor.assertProblems();
379+
}
380+
293381
}

0 commit comments

Comments
 (0)