Skip to content

Commit 48ccd1e

Browse files
Fix review feedback for Oracle RETURNING INTO support (#3762)
* Initial plan * Apply PR review feedback for Oracle RETURNING INTO support Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com> * Use DEFAULT_POSITIONAL_PARAMETER_MARKER constant and clarify assembledSql comment Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com>
1 parent 97625ba commit 48ccd1e

File tree

5 files changed

+30
-17
lines changed

5 files changed

+30
-17
lines changed

data-jdbc/src/main/java/io/micronaut/data/jdbc/operations/DefaultJdbcRepositoryOperations.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,9 @@ private <T, R> List<R> findAll(Connection connection, SqlPreparedQuery<T, R> pre
420420
boolean isEntityResult = preparedQuery.getResultDataType() == DataType.ENTITY;
421421
if (isEntityResult) {
422422
SqlResultEntityTypeMapper mapper = getSqlResultEntityTypeMapper(preparedQuery.getPersistentEntity(), columnNames, inCount);
423-
return List.of((R) mapper.readEntity(cs));
423+
T entity = (T) mapper.readEntity(cs);
424+
entity = triggerPostLoad(entity, (RuntimePersistentEntity<T>) preparedQuery.getPersistentEntity(), preparedQuery.getAnnotationMetadata());
425+
return List.of((R) entity);
424426
}
425427
// Otherwise single field
426428
List<R> result = new ArrayList<>();

data-model/src/main/java/io/micronaut/data/model/query/builder/sql/SqlQueryBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,7 @@ public QueryResult buildInsert(AnnotationMetadata repositoryMetadata, InsertQuer
10151015
.orElse(identity.getName()));
10161016
resultColumns.add(identityName);
10171017
resultColumnTypes.add(identity.getDataType());
1018+
unescapedColumns.add(identityName);
10181019
builder = "BEGIN " + builder + " RETURNING JSON_VALUE(" + columnName + ",'$." + identityName + "') INTO " + formatParameter(key + 1) + "; END;";
10191020
}
10201021
parameterBindings.add(new QueryParameterBinding() {

data-processor/src/main/java/io/micronaut/data/processor/visitors/RepositoryTypeElementVisitor.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -696,12 +696,8 @@ private void addQueryDefinition(MethodMatchContext methodMatchContext,
696696
List<AnnotationValue<?>> outAnnotations = new ArrayList<>(outBindings.size());
697697
for (QueryOutParameterBinding b : outBindings) {
698698
AnnotationValueBuilder<?> outBuilder = AnnotationValue.builder(DataMethodQueryOutParameter.class);
699-
if (StringUtils.isNotEmpty(b.getName())) {
700-
outBuilder.member(DataMethodQueryOutParameter.META_MEMBER_NAME, b.getName());
701-
}
702-
if (b.getDataType() != null) {
703-
outBuilder.member(DataMethodQueryOutParameter.META_MEMBER_DATA_TYPE, b.getDataType());
704-
}
699+
outBuilder.member(DataMethodQueryOutParameter.META_MEMBER_NAME, b.getName());
700+
outBuilder.member(DataMethodQueryOutParameter.META_MEMBER_DATA_TYPE, b.getDataType());
705701
outAnnotations.add(outBuilder.build());
706702
}
707703
annotationBuilder.member(DataMethodQuery.META_MEMBER_OUT_PARAMETERS, outAnnotations.toArray(new AnnotationValue[0]));

data-processor/src/main/java/io/micronaut/data/processor/visitors/finders/RawQueryMethodMatcher.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import io.micronaut.data.model.DataType;
6161
import io.micronaut.data.model.Association;
6262
import io.micronaut.data.model.query.builder.QueryOutParameterBinding;
63+
import io.micronaut.data.model.query.builder.sql.SqlQueryBuilder;
6364

6465
/**
6566
* Finder with custom defied query used to return a single result.
@@ -319,7 +320,8 @@ private QueryResult getQueryResult(MethodMatchContext matchContext,
319320
.orElse(Dialect.ANSI);
320321
if (dialect == Dialect.ORACLE) {
321322
SourcePersistentEntity entity = persistentEntity != null ? persistentEntity : matchContext.getRootEntity();
322-
int returningIdx = cleanLower.lastIndexOf("returning");
323+
String finalQueryLower = finalQueryString.toLowerCase(Locale.ENGLISH);
324+
int returningIdx = finalQueryLower.lastIndexOf("returning");
323325
String afterReturning = finalQueryString.substring(returningIdx + "returning".length()).trim();
324326
int intoPos = indexOfIntoIgnoreCase(afterReturning);
325327
String selection = intoPos > -1 ? afterReturning.substring(0, intoPos).trim() : afterReturning;
@@ -486,7 +488,19 @@ public DataType getDataType() {
486488
queryParts = new ArrayList<>();
487489
queryParts.add(finalSql);
488490
}
489-
return QueryResult.of("", queryParts, parameterBindings, outBindings, Map.of());
491+
// Build the assembled SQL from queryParts: parts represent SQL fragments between
492+
// positional IN-parameter placeholders (SqlQueryBuilder.DEFAULT_POSITIONAL_PARAMETER_MARKER).
493+
String assembledSql;
494+
if (queryParts.size() == 1) {
495+
assembledSql = queryParts.get(0);
496+
} else {
497+
var sqlBuilder = new StringBuilder(queryParts.get(0));
498+
for (int i = 1; i < queryParts.size(); i++) {
499+
sqlBuilder.append(SqlQueryBuilder.DEFAULT_POSITIONAL_PARAMETER_MARKER).append(queryParts.get(i));
500+
}
501+
assembledSql = sqlBuilder.toString();
502+
}
503+
return QueryResult.of(assembledSql, queryParts, parameterBindings, outBindings, Map.of());
490504
}
491505
}
492506

data-runtime/src/main/java/io/micronaut/data/runtime/query/internal/QueryResultStoredQuery.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,17 @@ private record QueryResultOutParameterBinding(
204204
io.micronaut.data.model.query.builder.QueryOutParameterBinding delegate) implements QueryOutParameterBinding {
205205

206206
@Override
207-
public String name() {
208-
return delegate.getName();
209-
}
210-
211-
@Override
212-
public DataType dataType() {
213-
return delegate.getDataType();
214-
}
207+
public String name() {
208+
return delegate.getName();
209+
}
215210

211+
@Override
212+
public DataType dataType() {
213+
return delegate.getDataType();
216214
}
217215

216+
}
217+
218218
private static final class QueryResultParameterBinding implements QueryParameterBinding {
219219
private final io.micronaut.data.model.query.builder.QueryParameterBinding p;
220220
private final List<QueryParameterBinding> all;

0 commit comments

Comments
 (0)