Skip to content

Commit a3a99d0

Browse files
committed
HHH-15523 Make use of SqlStringGenerationContext in MapBinder#getFromAndWhereFormula
1 parent 11c1b38 commit a3a99d0

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/annotations/MapBinder.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@
2626
import org.hibernate.annotations.NotFoundAction;
2727
import org.hibernate.annotations.common.reflection.XClass;
2828
import org.hibernate.annotations.common.reflection.XProperty;
29+
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
30+
import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl;
2931
import org.hibernate.boot.spi.BootstrapContext;
3032
import org.hibernate.boot.spi.MetadataBuildingContext;
3133
import org.hibernate.cfg.AccessType;
3234
import org.hibernate.cfg.AnnotatedClassType;
3335
import org.hibernate.cfg.AnnotationBinder;
36+
import org.hibernate.cfg.AvailableSettings;
3437
import org.hibernate.cfg.BinderHelper;
3538
import org.hibernate.cfg.CollectionPropertyHolder;
3639
import org.hibernate.cfg.CollectionSecondPass;
@@ -42,6 +45,8 @@
4245
import org.hibernate.cfg.PropertyPreloadedData;
4346
import org.hibernate.cfg.SecondPass;
4447
import org.hibernate.dialect.HSQLDialect;
48+
import org.hibernate.engine.config.spi.ConfigurationService;
49+
import org.hibernate.engine.jdbc.spi.JdbcServices;
4550
import org.hibernate.internal.util.StringHelper;
4651
import org.hibernate.mapping.Collection;
4752
import org.hibernate.mapping.Column;
@@ -57,6 +62,7 @@
5762
import org.hibernate.mapping.SimpleValue;
5863
import org.hibernate.mapping.ToOne;
5964
import org.hibernate.mapping.Value;
65+
import org.hibernate.service.ServiceRegistry;
6066
import org.hibernate.sql.Template;
6167

6268
/**
@@ -412,6 +418,14 @@ protected Value createFormulatedValue(
412418
MetadataBuildingContext buildingContext) {
413419
Value element = collection.getElement();
414420
String fromAndWhere = null;
421+
final ServiceRegistry serviceRegistry = buildingContext.getBootstrapContext().getServiceRegistry();
422+
final ConfigurationService configurationService = serviceRegistry.getService( ConfigurationService.class);
423+
final SqlStringGenerationContext generationContext = SqlStringGenerationContextImpl.fromExplicit(
424+
serviceRegistry.getService( JdbcServices.class).getJdbcEnvironment(),
425+
buildingContext.getMetadataCollector().getDatabase(),
426+
configurationService.getSetting(AvailableSettings.DEFAULT_CATALOG, String.class, null),
427+
configurationService.getSetting( AvailableSettings.DEFAULT_SCHEMA, String.class, null)
428+
);
415429
if ( !( element instanceof OneToMany ) ) {
416430
String referencedPropertyName = null;
417431
if ( element instanceof ToOne ) {
@@ -435,7 +449,7 @@ else if ( element instanceof DependantValue ) {
435449
referencedEntityColumns = referencedProperty.getColumnIterator();
436450
}
437451
fromAndWhere = getFromAndWhereFormula(
438-
associatedClass.getTable().getQualifiedTableName().toString(),
452+
generationContext.format(associatedClass.getTable().getQualifiedTableName()),
439453
element.getColumnIterator(),
440454
referencedEntityColumns
441455
);
@@ -444,9 +458,7 @@ else if ( element instanceof DependantValue ) {
444458
// HHH-11005 - only if we are OneToMany and location of map key property is at a different level, need to add a select
445459
if ( !associatedClass.equals( targetPropertyPersistentClass ) ) {
446460
fromAndWhere = getFromAndWhereFormula(
447-
targetPropertyPersistentClass.getTable()
448-
.getQualifiedTableName()
449-
.toString(),
461+
generationContext.format(targetPropertyPersistentClass.getTable().getQualifiedTableName()),
450462
element.getColumnIterator(),
451463
associatedClass.getIdentifier().getColumnIterator()
452464
);

hibernate-core/src/test/java/org/hibernate/test/jpa/ql/MapKeySubquerySchemaTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ public class MapKeySubquerySchemaTest extends BaseCoreFunctionalTestCase {
3232
public void testMapKeyLoad() {
3333
final QueryableCollection collectionPersister = (QueryableCollection) sessionFactory().getMetamodel()
3434
.collectionPersister( MapOwner.class.getName() + ".contents" );
35-
Assert.assertEquals(
36-
"(select a1.relationship_id from " + CUSTOM_SCHEMA + ".MapContent a1 where a1.id=contents_id)",
37-
collectionPersister.getIndexFormulas()[0]
35+
Assert.assertTrue(
36+
"Index SQL does not contain the schema name",
37+
collectionPersister.getIndexFormulas()[0].contains( CUSTOM_SCHEMA + ".MapContent " )
38+
3839
);
3940
}
4041

0 commit comments

Comments
 (0)