File tree Expand file tree Collapse file tree 7 files changed +45
-3
lines changed
main/java/org/springframework/data/jpa/repository/aot
test/java/org/springframework/data/jpa/repository Expand file tree Collapse file tree 7 files changed +45
-3
lines changed Original file line number Diff line number Diff line change @@ -656,7 +656,7 @@ public CodeBlock build() {
656656 : TypeName .get (context .getDomainType ());
657657 builder .add ("\n " );
658658
659- if (modifying .isPresent ()) {
659+ if (modifying .isPresent () && !( aotQuery instanceof StringAotQuery . DerivedAotQuery ) ) {
660660
661661 if (modifying .getBoolean ("flushAutomatically" )) {
662662 builder .addStatement ("this.$L.flush()" , context .fieldNameOf (EntityManager .class ));
Original file line number Diff line number Diff line change @@ -207,7 +207,7 @@ private Optional<Class<QueryEnhancerSelector>> getQueryEnhancerSelectorClass() {
207207 .metadataOnly (aotQueries .toMetadata (queryMethod .isPageQuery ()));
208208 }
209209
210- if (queryMethod .isModifyingQuery ()) {
210+ if (queryMethod .isModifyingQuery () && !( aotQueries . result () instanceof StringAotQuery . DerivedAotQuery ) ) {
211211
212212 TypeInformation <?> returnType = getRepositoryInformation ().getReturnType (method );
213213
Original file line number Diff line number Diff line change @@ -173,7 +173,7 @@ public String getQueryName() {
173173 *
174174 * @author Mark Paluch
175175 */
176- private static class DerivedAotQuery extends StringAotQuery {
176+ static class DerivedAotQuery extends StringAotQuery {
177177
178178 private final String queryString ;
179179 private final Limit limit ;
Original file line number Diff line number Diff line change @@ -1621,6 +1621,15 @@ void deleteOneShouldFailWhenMatchingMultipleResults() {
16211621 .isThrownBy (() -> repository .deleteOneByLastname (firstUser .getLastname ()));
16221622 }
16231623
1624+ @ Test // GH-4102
1625+ void deleteOneModifying () {
1626+
1627+ flushTestUsers ();
1628+
1629+ User user = repository .deleteModifyingByLastname (firstUser .getLastname ());
1630+ assertThat (user ).isEqualTo (firstUser );
1631+ }
1632+
16241633 @ Test // DATAJPA-460
16251634 void deleteByShouldRemoveElementsMatchingDerivedQuery () {
16261635
Original file line number Diff line number Diff line change @@ -558,6 +558,31 @@ void testDerivedDeleteSingle() {
558558 assertThat (yodaShouldBeGone ).isNull ();
559559 }
560560
561+ @ Test // GH-4102
562+ void testDerivedDeleteSingleWithModifying () {
563+
564+ User user = fragment .deleteByEmailAddressAndIdIsNotNull ("yoda@jedi.org" );
565+ assertThat (user ).isNotNull ().extracting (User ::getEmailAddress ).isEqualTo ("yoda@jedi.org" );
566+
567+ Object yodaShouldBeGone = em
568+ .createQuery ("SELECT u FROM %s u WHERE u.emailAddress = 'yoda@jedi.org'" .formatted (User .class .getName ()))
569+ .getSingleResultOrNull ();
570+ assertThat (yodaShouldBeGone ).isNull ();
571+ }
572+
573+ @ Test // GH-4102
574+ void testDerivedDeleteAndReturnCount () {
575+
576+ int count = fragment .deleteAndReturnCountByEmailAddress ("yoda@jedi.org" );
577+
578+ assertThat (count ).isEqualTo (1 );
579+
580+ Object yodaShouldBeGone = em
581+ .createQuery ("SELECT u FROM %s u WHERE u.emailAddress = 'yoda@jedi.org'" .formatted (User .class .getName ()))
582+ .getSingleResultOrNull ();
583+ assertThat (yodaShouldBeGone ).isNull ();
584+ }
585+
561586 @ Test // GH-3830
562587 void shouldReturnStreamableDelete () {
563588
Original file line number Diff line number Diff line change @@ -205,6 +205,11 @@ List<User> findWithParameterNameByLastnameStartingWithOrLastnameEndingWith(@Para
205205
206206 User deleteByEmailAddress (String username );
207207
208+ @ Modifying
209+ User deleteByEmailAddressAndIdIsNotNull (String email );
210+
211+ int deleteAndReturnCountByEmailAddress (String username );
212+
208213 Streamable <User > deleteStreamableByEmailAddress (String username );
209214
210215 // cannot generate delete and return a domain object
Original file line number Diff line number Diff line change @@ -307,6 +307,9 @@ Window<User> findTop3ByFirstnameStartingWithOrderByFirstnameAscEmailAddressAsc(S
307307 // DATAJPA-460
308308 List <User > deleteByLastname (String lastname );
309309
310+ @ Modifying
311+ User deleteModifyingByLastname (String lastname );
312+
310313 User deleteOneByLastname (String lastname );
311314
312315 Optional <User > deleteOneOptionalByLastname (String lastname );
You can’t perform that action at this time.
0 commit comments