Skip to content

Commit 34ca6d4

Browse files
committed
HHH-18629 Fix inconsistent column alias generated while result class is used for placeholder
1 parent 0684c6e commit 34ca6d4

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,8 @@ else if ( List.class.equals( resultClass ) ) {
969969
query.setTupleTransformer( NativeQueryListTransformer.INSTANCE );
970970
}
971971
else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) {
972-
query.addEntity( resultClass, LockMode.READ );
972+
// use empty string as tableAlias to identify it as implicit
973+
query.addEntity( "", resultClass, LockMode.READ );
973974
}
974975
else if ( resultClass != Object.class && resultClass != Object[].class ) {
975976
if ( isClass( resultClass ) && !hasJavaTypeDescriptor( resultClass ) ) {

hibernate-core/src/main/java/org/hibernate/query/results/ResultSetMapping.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ public interface ResultSetMapping extends JdbcValuesMappingProducer {
7777
*/
7878
void addResultBuilder(ResultBuilder resultBuilder);
7979

80+
/**
81+
* Remove a builder
82+
*/
83+
void removeResultBuilder(ResultBuilder resultBuilder);
84+
8085
/**
8186
* Add a legacy fetch builder
8287
*/

hibernate-core/src/main/java/org/hibernate/query/results/ResultSetMappingImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ public void addResultBuilder(ResultBuilder resultBuilder) {
137137
resultBuilders.add( resultBuilder );
138138
}
139139

140+
@Override
141+
public void removeResultBuilder(ResultBuilder resultBuilder) {
142+
resultBuilders.remove( resultBuilder );
143+
}
144+
140145
@Override
141146
public void addLegacyFetchBuilder(DynamicFetchBuilderLegacy fetchBuilder) {
142147
final Map<String, DynamicFetchBuilderLegacy> existingFetchBuildersByOwner;

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,23 @@ public NativeQueryImplementor<R> addScalar(int position, Class<?> type) {
942942
}
943943

944944
protected NativeQueryImplementor<R> registerBuilder(ResultBuilder builder) {
945+
// remove implicit ResultBuilder if explicit one provided
946+
if ( builder instanceof DynamicResultBuilderEntityCalculated dynamicBuilder ) {
947+
ResultBuilder implicitResultBuilder = null;
948+
for ( ResultBuilder existing : resultSetMapping.getResultBuilders() ) {
949+
if ( existing instanceof DynamicResultBuilderEntityCalculated existingDynamicBuilder ) {
950+
if ( "".equals( existingDynamicBuilder.getTableAlias() ) // implicit
951+
&& existingDynamicBuilder.getNavigablePath().equals( dynamicBuilder.getNavigablePath() )
952+
&& existingDynamicBuilder.getEntityMapping().equals( dynamicBuilder.getEntityMapping() ) ) {
953+
implicitResultBuilder = existingDynamicBuilder;
954+
break;
955+
}
956+
}
957+
}
958+
if ( implicitResultBuilder != null ) {
959+
resultSetMapping.removeResultBuilder( implicitResultBuilder );
960+
}
961+
}
945962
resultSetMapping.addResultBuilder( builder );
946963
return this;
947964
}

0 commit comments

Comments
 (0)