Skip to content

Commit f9568b4

Browse files
committed
HHH-18610 SQLGrammarException: Unable to find column position by name: TYPE when using Single Table Inheritance with a strict JDBC driver such as PostgreSQL
1 parent 869da60 commit f9568b4

File tree

54 files changed

+569
-479
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+569
-479
lines changed

hibernate-core/src/main/java/org/hibernate/generator/values/GeneratedValueBasicResultBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.sql.ast.tree.from.TableGroup;
1717
import org.hibernate.sql.ast.tree.from.TableReference;
1818
import org.hibernate.sql.results.graph.DomainResultCreationState;
19+
import org.hibernate.sql.results.graph.Fetchable;
1920
import org.hibernate.sql.results.graph.basic.BasicResult;
2021
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
2122

@@ -60,7 +61,7 @@ public ResultBuilder cacheKeyInstance() {
6061
public BasicResult<?> buildResult(
6162
JdbcValuesMetadata jdbcResultsMetadata,
6263
int resultPosition,
63-
BiFunction<String, String, DynamicFetchBuilderLegacy> legacyFetchResolver,
64+
BiFunction<String, Fetchable, DynamicFetchBuilderLegacy> legacyFetchResolver,
6465
DomainResultCreationState domainResultCreationState) {
6566
final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState );
6667

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EntityIdentifierMapping.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import jakarta.persistence.EmbeddedId;
1414
import jakarta.persistence.Id;
1515
import jakarta.persistence.IdClass;
16+
import org.hibernate.sql.results.graph.Fetchable;
1617

1718

1819
/**
@@ -22,7 +23,7 @@
2223
* @see EmbeddedId
2324
* @see Nature
2425
*/
25-
public interface EntityIdentifierMapping extends ValuedModelPart {
26+
public interface EntityIdentifierMapping extends ValuedModelPart, Fetchable {
2627

2728
String ID_ROLE_NAME = "{id}";
2829
String LEGACY_ID_NAME = "id";

hibernate-core/src/main/java/org/hibernate/procedure/internal/EntityDomainResultBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy;
1717
import org.hibernate.query.results.implicit.ImplicitFetchBuilderBasic;
1818
import org.hibernate.sql.results.graph.DomainResultCreationState;
19+
import org.hibernate.sql.results.graph.Fetchable;
1920
import org.hibernate.sql.results.graph.entity.EntityResult;
2021
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
2122

@@ -57,7 +58,7 @@ public ResultBuilder cacheKeyInstance() {
5758
public EntityResult buildResult(
5859
JdbcValuesMetadata jdbcResultsMetadata,
5960
int resultPosition,
60-
BiFunction<String, String, DynamicFetchBuilderLegacy> legacyFetchResolver,
61+
BiFunction<String, Fetchable, DynamicFetchBuilderLegacy> legacyFetchResolver,
6162
DomainResultCreationState domainResultCreationState) {
6263

6364
return new EntityResultImpl(

hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.sql.ast.spi.SqlSelection;
1515
import org.hibernate.sql.results.graph.DomainResult;
1616
import org.hibernate.sql.results.graph.DomainResultCreationState;
17+
import org.hibernate.sql.results.graph.Fetchable;
1718
import org.hibernate.sql.results.graph.basic.BasicResult;
1819
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
1920
import org.hibernate.type.BasicType;
@@ -38,7 +39,7 @@ public Class<?> getJavaType() {
3839
public DomainResult<T> buildResult(
3940
JdbcValuesMetadata jdbcResultsMetadata,
4041
int resultPosition,
41-
BiFunction<String, String, DynamicFetchBuilderLegacy> legacyFetchResolver,
42+
BiFunction<String, Fetchable, DynamicFetchBuilderLegacy> legacyFetchResolver,
4243
DomainResultCreationState domainResultCreationState) {
4344
final SqlExpressionResolver sqlExpressionResolver = domainResultCreationState.getSqlAstCreationState()
4445
.getSqlExpressionResolver();

hibernate-core/src/main/java/org/hibernate/query/NativeQuery.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
2929
import org.hibernate.metamodel.model.domain.BasicDomainType;
3030
import org.hibernate.spi.NavigablePath;
31+
import org.hibernate.sql.results.graph.Fetchable;
3132
import org.hibernate.transform.ResultTransformer;
3233
import org.hibernate.type.BasicTypeReference;
3334

@@ -505,7 +506,7 @@ interface FetchReturn extends ResultNode {
505506

506507
String getOwnerAlias();
507508

508-
String getFetchableName();
509+
Fetchable getFetchable();
509510

510511
/**
511512
* Set the lock mode for this return.

hibernate-core/src/main/java/org/hibernate/query/internal/FetchMementoHbmStandard.java

Lines changed: 99 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
public class FetchMementoHbmStandard implements FetchMemento, FetchMemento.Parent {
3131

3232
private static final String ELEMENT_PREFIX = "element.";
33+
private static final int ELEMENT_PREFIX_LENGTH = 8;
3334

3435
public interface FetchParentMemento {
3536
NavigablePath getNavigablePath();
@@ -74,55 +75,110 @@ public FetchBuilder resolve(
7475
Parent parent,
7576
Consumer<String> querySpaceConsumer,
7677
ResultSetMappingResolutionContext context) {
77-
final Map<String, FetchBuilder> fetchBuilderMap = new HashMap<>();
78-
fetchMementoMap.forEach(
79-
(attrName, fetchMemento) -> fetchBuilderMap.put(
80-
attrName,
81-
fetchMemento.resolve(this, querySpaceConsumer, context )
82-
)
83-
);
84-
final DynamicResultBuilderEntityStandard resultBuilder;
85-
if ( fetchable instanceof PluralAttributeMapping ) {
86-
resultBuilder = new DynamicResultBuilderEntityStandard(
87-
(EntityMappingType) ( (PluralAttributeMapping) fetchable ).getElementDescriptor().getPartMappingType(),
88-
tableAlias,
89-
navigablePath
90-
);
91-
FetchBuilder element = fetchBuilderMap.get( "element" );
92-
if ( element != null ) {
93-
if ( element instanceof DynamicFetchBuilder ) {
94-
resultBuilder.addIdColumnAliases(
95-
( (DynamicFetchBuilder) element ).getColumnAliases().toArray( new String[0] )
96-
);
97-
}
98-
else {
99-
resultBuilder.addIdColumnAliases(
100-
( (CompleteFetchBuilderEntityValuedModelPart) element ).getColumnAliases().toArray( new String[0] )
101-
);
102-
}
103-
}
104-
FetchBuilder index = fetchBuilderMap.get( "index" );
105-
if ( index != null ) {
106-
resultBuilder.addFetchBuilder( CollectionPart.Nature.INDEX.getName(), index );
107-
}
108-
for ( Map.Entry<String, FetchBuilder> entry : fetchBuilderMap.entrySet() ) {
109-
if ( entry.getKey().startsWith( ELEMENT_PREFIX ) ) {
110-
resultBuilder.addFetchBuilder( entry.getKey().substring( ELEMENT_PREFIX.length() ), entry.getValue() );
111-
}
112-
}
78+
if ( fetchable instanceof PluralAttributeMapping pluralAttributeMapping ) {
79+
return resolve( pluralAttributeMapping, querySpaceConsumer, context );
11380
}
11481
else {
115-
resultBuilder = new DynamicResultBuilderEntityStandard(
116-
( (ToOneAttributeMapping) fetchable ).getEntityMappingType(),
117-
tableAlias,
118-
navigablePath
119-
);
120-
fetchBuilderMap.forEach( resultBuilder::addFetchBuilder );
82+
return resolve( (ToOneAttributeMapping) fetchable, querySpaceConsumer, context );
12183
}
84+
}
85+
86+
private FetchBuilder resolve(
87+
PluralAttributeMapping pluralAttributeMapping,
88+
Consumer<String> querySpaceConsumer,
89+
ResultSetMappingResolutionContext context) {
90+
final DynamicResultBuilderEntityStandard resultBuilder;
91+
EntityMappingType partMappingType = (EntityMappingType) pluralAttributeMapping.getElementDescriptor()
92+
.getPartMappingType();
93+
resultBuilder = new DynamicResultBuilderEntityStandard(
94+
partMappingType,
95+
tableAlias,
96+
navigablePath
97+
);
98+
final Map<Fetchable, FetchBuilder> fetchBuilderMap = new HashMap<>();
99+
fetchMementoMap.forEach(
100+
(attrName, fetchMemento) -> {
101+
final FetchBuilder fetchBuilder = fetchMemento.resolve( this, querySpaceConsumer, context );
102+
103+
if ( attrName.equals( "element" ) ) {
104+
if ( fetchBuilder instanceof DynamicFetchBuilder dynamicFetchBuilder ) {
105+
resultBuilder.addIdColumnAliases(
106+
dynamicFetchBuilder.getColumnAliases().toArray( new String[0] )
107+
);
108+
}
109+
else {
110+
resultBuilder.addIdColumnAliases(
111+
((CompleteFetchBuilderEntityValuedModelPart) fetchBuilder).getColumnAliases()
112+
.toArray( new String[0] )
113+
);
114+
}
115+
fetchBuilderMap.put(
116+
pluralAttributeMapping.getElementDescriptor(),
117+
fetchBuilder
118+
);
119+
}
120+
else if ( attrName.equals( "index" ) ) {
121+
final CollectionPart indexDescriptor = pluralAttributeMapping.getIndexDescriptor();
122+
resultBuilder.addFetchBuilder( indexDescriptor, fetchBuilder );
123+
fetchBuilderMap.put(
124+
indexDescriptor,
125+
fetchBuilder
126+
);
127+
}
128+
else if ( attrName.startsWith( ELEMENT_PREFIX ) ) {
129+
final Fetchable attributeMapping = (Fetchable) partMappingType.findByPath(
130+
attrName.substring( ELEMENT_PREFIX_LENGTH ) );
131+
resultBuilder.addFetchBuilder( attributeMapping, fetchBuilder );
132+
fetchBuilderMap.put(
133+
attributeMapping,
134+
fetchBuilder
135+
);
136+
}
137+
else {
138+
final Fetchable attributeMapping = (Fetchable) partMappingType.findByPath( attrName );
139+
resultBuilder.addFetchBuilder( attributeMapping, fetchBuilder );
140+
fetchBuilderMap.put(
141+
attributeMapping,
142+
fetchBuilder
143+
);
144+
}
145+
}
146+
);
147+
return new DynamicFetchBuilderLegacy(
148+
tableAlias,
149+
ownerTableAlias,
150+
fetchable,
151+
keyColumnNames,
152+
fetchBuilderMap,
153+
resultBuilder
154+
);
155+
}
156+
157+
private FetchBuilder resolve(
158+
ToOneAttributeMapping toOneAttributeMapping,
159+
Consumer<String> querySpaceConsumer,
160+
ResultSetMappingResolutionContext context) {
161+
final Map<Fetchable, FetchBuilder> fetchBuilderMap = new HashMap<>();
162+
fetchMementoMap.forEach(
163+
(attrName, fetchMemento) ->
164+
fetchBuilderMap.put(
165+
(Fetchable) toOneAttributeMapping.findSubPart( attrName ),
166+
fetchMemento.resolve( this, querySpaceConsumer, context )
167+
)
168+
);
169+
final DynamicResultBuilderEntityStandard resultBuilder;
170+
resultBuilder = new DynamicResultBuilderEntityStandard(
171+
toOneAttributeMapping.getEntityMappingType(),
172+
tableAlias,
173+
navigablePath
174+
);
175+
fetchBuilderMap.forEach( (fetchable, fetchBuilder) ->
176+
resultBuilder.addFetchBuilder( fetchable, fetchBuilder )
177+
);
122178
return new DynamicFetchBuilderLegacy(
123179
tableAlias,
124180
ownerTableAlias,
125-
fetchable.getFetchableName(),
181+
fetchable,
126182
keyColumnNames,
127183
fetchBuilderMap,
128184
resultBuilder

hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoEntityJpa.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.hibernate.query.results.complete.DelayedFetchBuilderBasicPart;
2424
import org.hibernate.query.results.implicit.ImplicitFetchBuilderBasic;
2525
import org.hibernate.spi.NavigablePath;
26+
import org.hibernate.sql.results.graph.Fetchable;
2627

2728
/**
2829
* @author Steve Ebersole
@@ -70,13 +71,13 @@ public ResultBuilderEntityValued resolve(
7071
}
7172
}
7273

73-
final HashMap<String, FetchBuilder> explicitFetchBuilderMap = new HashMap<>();
74+
final HashMap<Fetchable, FetchBuilder> explicitFetchBuilderMap = new HashMap<>();
7475

7576
// If there are no explicit fetches, we don't register DELAYED builders to get implicit fetching of all basic fetchables
7677
if ( !explicitFetchMementoMap.isEmpty() ) {
7778
explicitFetchMementoMap.forEach(
7879
(relativePath, fetchMemento) -> explicitFetchBuilderMap.put(
79-
relativePath,
80+
(Fetchable) entityDescriptor.findByPath( relativePath ),
8081
fetchMemento.resolve( this, querySpaceConsumer, context )
8182
)
8283
);
@@ -87,13 +88,13 @@ public ResultBuilderEntityValued resolve(
8788
attributeMapping -> {
8889
final BasicValuedModelPart basicPart = attributeMapping.asBasicValuedModelPart();
8990
if ( basicPart != null ) {
90-
final Function<String, FetchBuilder> fetchBuilderCreator = k -> new DelayedFetchBuilderBasicPart(
91-
navigablePath.append( k ),
91+
final Function<Fetchable, FetchBuilder> fetchBuilderCreator = k -> new DelayedFetchBuilderBasicPart(
92+
navigablePath.append( k.getFetchableName() ),
9293
basicPart,
9394
isEnhancedForLazyLoading
9495
);
9596
explicitFetchBuilderMap.computeIfAbsent(
96-
attributeMapping.getFetchableName(),
97+
attributeMapping,
9798
fetchBuilderCreator
9899
);
99100
}

hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoEntityStandard.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.query.results.FetchBuilder;
2020
import org.hibernate.query.results.ResultBuilderEntityValued;
2121
import org.hibernate.query.results.complete.CompleteResultBuilderEntityStandard;
22+
import org.hibernate.sql.results.graph.Fetchable;
2223

2324
/**
2425
* @author Steve Ebersole
@@ -64,11 +65,11 @@ public ResultBuilderEntityValued resolve(
6465
? (BasicValuedFetchBuilder) discriminatorMemento.resolve( this, querySpaceConsumer, context )
6566
: null;
6667

67-
final HashMap<String, FetchBuilder> fetchBuilderMap = new HashMap<>();
68+
final HashMap<Fetchable, FetchBuilder> fetchBuilderMap = new HashMap<>();
6869

6970
fetchMementoMap.forEach(
7071
(attrName, fetchMemento) -> fetchBuilderMap.put(
71-
attrName,
72+
(Fetchable) entityDescriptor.findByPath( attrName ),
7273
fetchMemento.resolve(this, querySpaceConsumer, context )
7374
)
7475
);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy;
1111
import org.hibernate.sql.results.graph.DomainResultCreationState;
1212
import org.hibernate.sql.results.graph.FetchParent;
13+
import org.hibernate.sql.results.graph.Fetchable;
1314
import org.hibernate.sql.results.graph.basic.BasicFetch;
1415
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
1516

@@ -22,6 +23,6 @@ BasicFetch<?> buildFetch(
2223
FetchParent parent,
2324
NavigablePath fetchPath,
2425
JdbcValuesMetadata jdbcResultsMetadata,
25-
BiFunction<String, String, DynamicFetchBuilderLegacy> legacyFetchResolver,
26+
BiFunction<String, Fetchable, DynamicFetchBuilderLegacy> legacyFetchResolver,
2627
DomainResultCreationState domainResultCreationState);
2728
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ public static DynamicResultBuilderEntityCalculated entityCalculated(
235235
return new DynamicResultBuilderEntityCalculated( entityMapping, tableAlias, explicitLockMode );
236236
}
237237

238-
public static DynamicFetchBuilderLegacy fetch(String tableAlias, String ownerTableAlias, String joinPropertyName) {
239-
return new DynamicFetchBuilderLegacy( tableAlias, ownerTableAlias, joinPropertyName, new ArrayList<>(), new HashMap<>() );
238+
public static DynamicFetchBuilderLegacy fetch(String tableAlias, String ownerTableAlias, Fetchable fetchable) {
239+
return new DynamicFetchBuilderLegacy( tableAlias, ownerTableAlias, fetchable, new ArrayList<>(), new HashMap<>() );
240240
}
241241

242242
public static ResultBuilder resultClassBuilder(
@@ -269,7 +269,7 @@ public static ImplicitFetchBuilder implicitFetchBuilder(
269269
DomainResultCreationState creationState) {
270270
final BasicValuedModelPart basicValuedFetchable = fetchable.asBasicValuedModelPart();
271271
if ( basicValuedFetchable != null ) {
272-
return new ImplicitFetchBuilderBasic( fetchPath, basicValuedFetchable, creationState );
272+
return new ImplicitFetchBuilderBasic( fetchPath, fetchable, basicValuedFetchable, creationState );
273273
}
274274

275275
if ( fetchable instanceof EmbeddableValuedFetchable ) {

0 commit comments

Comments
 (0)