Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.hibernate.MappingException;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.common.reflection.XClass;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.boot.model.relational.QualifiedName;
Expand Down Expand Up @@ -109,7 +110,8 @@ public void doSecondPass(Map<String, PersistentClass> persistentClasses) throws
orderColumns( registeredUdt, originalOrder );
}
else {
addAuxiliaryObjects = false;
addAuxiliaryObjects =
isAggregateArray() && namespace.locateUserDefinedArrayType( Identifier.toIdentifier( aggregateColumn.getSqlType() ) ) == null;
validateEqual( registeredUdt, udt );
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,6 @@ else if ( string.charAt( i + 1 ) == '{' ) {
quotes + 1,
arrayList,
(BasicType<Object>) pluralType.getElementType(),
returnEmbeddable,
options
);
assert string.charAt( subEnd - 1 ) == '}';
Expand Down Expand Up @@ -624,7 +623,6 @@ else if ( jdbcMapping.getJavaTypeDescriptor().getJavaTypeClass().isEnum()
quotes + 1,
arrayList,
(BasicType<Object>) pluralType.getElementType(),
returnEmbeddable,
options
);
assert string.charAt( i - 1 ) == '}';
Expand Down Expand Up @@ -667,7 +665,6 @@ private int deserializeArray(
int quotes,
ArrayList<Object> values,
BasicType<Object> elementType,
boolean returnEmbeddable,
WrapperOptions options) throws SQLException {
boolean inQuote = false;
StringBuilder escapingSb = null;
Expand Down Expand Up @@ -860,30 +857,17 @@ private int deserializeArray(
i + 1,
quotes + 1,
subValues,
returnEmbeddable,
true,
options
);
if ( returnEmbeddable ) {
final StructAttributeValues attributeValues = structJdbcType.getAttributeValues(
structJdbcType.embeddableMappingType,
structJdbcType.orderMapping,
subValues,
options
);
final Object subValue = instantiate( structJdbcType.embeddableMappingType, attributeValues, options.getSessionFactory() );
final StructAttributeValues attributeValues = structJdbcType.getAttributeValues(
structJdbcType.embeddableMappingType,
structJdbcType.orderMapping,
subValues,
options
);
final Object subValue = instantiate( structJdbcType.embeddableMappingType, attributeValues, options.getSessionFactory() );
values.add( subValue );
}
else {
if ( structJdbcType.inverseOrderMapping != null ) {
StructHelper.orderJdbcValues(
structJdbcType.embeddableMappingType,
structJdbcType.inverseOrderMapping,
subValues.clone(),
subValues
);
}
values.add( subValues );
}
// The subEnd points to the first character after the '}',
// so move forward the index to point to the next char after quotes
assert isDoubleQuote( string, subEnd, expectedQuotes );
Expand Down Expand Up @@ -1001,40 +985,8 @@ else if ( elementType.getJavaTypeDescriptor().getJavaTypeClass().isEnum()
}

private SelectableMapping getJdbcValueSelectable(int jdbcValueSelectableIndex) {
if ( orderMapping != null ) {
final int numberOfAttributeMappings = embeddableMappingType.getNumberOfAttributeMappings();
final int size = numberOfAttributeMappings + ( embeddableMappingType.isPolymorphic() ? 1 : 0 );
int count = 0;
for ( int i = 0; i < size; i++ ) {
final ValuedModelPart modelPart = getEmbeddedPart( embeddableMappingType, orderMapping[i] );
final MappingType mappedType = modelPart.getMappedType();
if ( mappedType instanceof EmbeddableMappingType ) {
final EmbeddableMappingType embeddableMappingType = (EmbeddableMappingType) mappedType;
final SelectableMapping aggregateMapping = embeddableMappingType.getAggregateMapping();
if ( aggregateMapping == null ) {
final SelectableMapping subSelectable = embeddableMappingType.getJdbcValueSelectable( jdbcValueSelectableIndex - count );
if ( subSelectable != null ) {
return subSelectable;
}
count += embeddableMappingType.getJdbcValueCount();
}
else {
if ( count == jdbcValueSelectableIndex ) {
return aggregateMapping;
}
count++;
}
}
else {
if ( count == jdbcValueSelectableIndex ) {
return (SelectableMapping) modelPart;
}
count += modelPart.getJdbcTypeCount();
}
}
return null;
}
return embeddableMappingType.getJdbcValueSelectable( jdbcValueSelectableIndex );
return embeddableMappingType.getJdbcValueSelectable(
orderMapping != null ? orderMapping[jdbcValueSelectableIndex] : jdbcValueSelectableIndex );
}

private static boolean repeatsChar(String string, int start, int times, char expectedChar) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,10 @@ else if ( attributeMapping instanceof EmbeddedAttributeMapping ) {
final String tagName = aggregateMapping.getSelectableName();
sb.append( '<' );
sb.append( tagName );
if ( array[i] == null ) {
sb.append( "/>" );
continue;
}
sb.append( '>' );
toString(
mappingType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -333,9 +333,9 @@ public List<AuxiliaryDatabaseObject> aggregateAuxiliaryDatabaseObjects(
var serializerSb = new StringBuilder();
var deserializerSb = new StringBuilder();
serializerSb.append( "create function " ).append( columnType ).append( "_serializer(v " ).append( columnType ).append( ") returns xml language sql " )
.append( "return xmlelement(name \"").append( XmlHelper.ROOT_TAG ).append( "\"" );
.append( "return case when v is null then null else xmlelement(name \"").append( XmlHelper.ROOT_TAG ).append( "\"" );
appendSerializer( aggregatedColumns, serializerSb, "v.." );
serializerSb.append( ')' );
serializerSb.append( ") end" );

deserializerSb.append( "create function " ).append( columnType ).append( "_deserializer(v xml) returns " ).append( columnType ).append( " language sql " )
.append( "return select " ).append( columnType ).append( "()" );
Expand Down Expand Up @@ -385,6 +385,10 @@ private static void appendSerializer(List<Column> aggregatedColumns, StringBuild
}
for ( Column udtColumn : aggregatedColumns ) {
serializerSb.append( sep );
if ( udtColumn.getSqlTypeCode() == STRUCT ) {
serializerSb.append( "case when ").append( prefix ).append( udtColumn.getName() )
.append( " is null then null else " );
}
serializerSb.append( "xmlelement(name \"" ).append( udtColumn.getName() ).append( "\"" );
if ( udtColumn.getSqlTypeCode() == STRUCT ) {
final AggregateColumn aggregateColumn = (AggregateColumn) udtColumn;
Expand All @@ -402,6 +406,9 @@ else if ( needsVarcharForBitDataCast( udtColumn.getSqlType() ) ) {
serializerSb.append( ',' ).append( prefix ).append( udtColumn.getName() );
}
serializerSb.append( ')' );
if ( udtColumn.getSqlTypeCode() == STRUCT ) {
serializerSb.append( " end" );
}
sep = ',';
}
if ( aggregatedColumns.size() > 1 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.hibernate.metamodel.mapping.MappedDiscriminatorConverter;
import org.hibernate.metamodel.mapping.MappingType;
import org.hibernate.metamodel.mapping.SelectableConsumer;
import org.hibernate.metamodel.mapping.SelectablePath;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.spi.NavigablePath;
Expand Down Expand Up @@ -58,6 +59,7 @@ public class AnyDiscriminatorPart implements DiscriminatorMapping, FetchOptions

private final String table;
private final String column;
private final SelectablePath selectablePath;
private final String customReadExpression;
private final String customWriteExpression;
private final String columnDefinition;
Expand All @@ -76,7 +78,10 @@ public AnyDiscriminatorPart(
NavigableRole partRole,
DiscriminatedAssociationModelPart declaringType,
String table,
String column, String customReadExpression, String customWriteExpression,
String column,
SelectablePath selectablePath,
String customReadExpression,
String customWriteExpression,
String columnDefinition,
Long length,
Integer precision,
Expand All @@ -91,6 +96,7 @@ public AnyDiscriminatorPart(
this.declaringType = declaringType;
this.table = table;
this.column = column;
this.selectablePath = selectablePath;
this.customReadExpression = customReadExpression;
this.customWriteExpression = customWriteExpression;
this.columnDefinition = columnDefinition;
Expand Down Expand Up @@ -136,6 +142,16 @@ public String getSelectionExpression() {
return column;
}

@Override
public String getSelectableName() {
return selectablePath.getSelectableName();
}

@Override
public SelectablePath getSelectablePath() {
return selectablePath;
}

@Override
public boolean isFormula() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.mapping.MappingType;
import org.hibernate.metamodel.mapping.SelectableConsumer;
import org.hibernate.metamodel.mapping.SelectablePath;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.ast.spi.FromClauseAccess;
Expand Down Expand Up @@ -47,6 +48,7 @@ public class AnyKeyPart implements BasicValuedModelPart, FetchOptions {
private final NavigableRole navigableRole;
private final String table;
private final String column;
private final SelectablePath selectablePath;
private final DiscriminatedAssociationModelPart anyPart;
private final String customReadExpression;
private final String customWriteExpression;
Expand All @@ -65,6 +67,7 @@ public AnyKeyPart(
DiscriminatedAssociationModelPart anyPart,
String table,
String column,
SelectablePath selectablePath,
String customReadExpression,
String customWriteExpression,
String columnDefinition,
Expand All @@ -79,6 +82,7 @@ public AnyKeyPart(
this.navigableRole = navigableRole;
this.table = table;
this.column = column;
this.selectablePath = selectablePath;
this.anyPart = anyPart;
this.customReadExpression = customReadExpression;
this.customWriteExpression = customWriteExpression;
Expand All @@ -103,6 +107,16 @@ public String getSelectionExpression() {
return column;
}

@Override
public String getSelectableName() {
return selectablePath.getSelectableName();
}

@Override
public SelectablePath getSelectablePath() {
return selectablePath;
}

@Override
public boolean isFormula() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.MappingType;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.SelectablePath;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.ast.tree.from.TableGroup;
Expand Down Expand Up @@ -73,13 +74,18 @@ public static DiscriminatedAssociationMapping from(
assert !keySelectable.isFormula();
final Column metaColumn = (Column) metaSelectable;
final Column keyColumn = (Column) keySelectable;
final SelectablePath parentSelectablePath = declaringModelPart.asAttributeMapping() != null
? MappingModelCreationHelper.getSelectablePath( declaringModelPart.asAttributeMapping().getDeclaringType() )
: null;

final MetaType metaType = (MetaType) anyType.getDiscriminatorType();
final AnyDiscriminatorPart discriminatorPart = new AnyDiscriminatorPart(
containerRole.append( AnyDiscriminatorPart.ROLE_NAME),
containerRole.append( AnyDiscriminatorPart.ROLE_NAME ),
declaringModelPart,
tableName,
metaColumn.getText( dialect ),
parentSelectablePath != null ? parentSelectablePath.append( metaColumn.getQuotedName( dialect ) )
: new SelectablePath( metaColumn.getQuotedName( dialect ) ),
metaColumn.getCustomReadExpression(),
metaColumn.getCustomWriteExpression(),
metaColumn.getSqlType(),
Expand All @@ -101,6 +107,8 @@ public static DiscriminatedAssociationMapping from(
declaringModelPart,
tableName,
keyColumn.getText( dialect ),
parentSelectablePath != null ? parentSelectablePath.append( keyColumn.getQuotedName( dialect ) )
: new SelectablePath( keyColumn.getQuotedName( dialect ) ),
keyColumn.getCustomReadExpression(),
keyColumn.getCustomWriteExpression(),
keyColumn.getSqlType(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -970,13 +970,15 @@ else if ( modelPart == null ) {
( (PropertyBasedMapping) simpleFkTarget ).getPropertyAccess()
);
}
final SelectablePath parentSelectablePath = getSelectablePath( attributeMapping.getDeclaringType() );
final SelectableMapping keySelectableMapping;
int i = 0;
final Value value = bootProperty.getValue();
if ( columnIterator.hasNext() ) {
keySelectableMapping = SelectableMappingImpl.from(
tableExpression,
columnIterator.next(),
parentSelectablePath,
simpleFkTarget.getJdbcMapping(),
creationProcess.getCreationContext().getTypeConfiguration(),
value.isColumnInsertable( i ),
Expand All @@ -993,6 +995,7 @@ else if ( modelPart == null ) {
keySelectableMapping = SelectableMappingImpl.from(
tableExpression,
table.getPrimaryKey().getColumn( 0 ),
parentSelectablePath,
simpleFkTarget.getJdbcMapping(),
creationProcess.getCreationContext().getTypeConfiguration(),
value.isColumnInsertable( 0 ),
Expand Down Expand Up @@ -1129,6 +1132,7 @@ private static EmbeddedForeignKeyDescriptor buildEmbeddableForeignKeyDescriptor(
boolean[] updateable,
Dialect dialect,
MappingModelCreationProcess creationProcess) {
final SelectablePath parentSelectablePath = getSelectablePath( keyDeclaringType );
final boolean hasConstraint;
final SelectableMappings keySelectableMappings;
if ( bootValueMapping instanceof Collection ) {
Expand All @@ -1142,6 +1146,7 @@ private static EmbeddedForeignKeyDescriptor buildEmbeddableForeignKeyDescriptor(
keyTableExpression,
collectionBootValueMapping.getKey(),
getPropertyOrder( bootValueMapping, creationProcess ),
parentSelectablePath,
creationProcess.getCreationContext().getMetadata(),
creationProcess.getCreationContext().getTypeConfiguration(),
insertable,
Expand All @@ -1167,6 +1172,7 @@ private static EmbeddedForeignKeyDescriptor buildEmbeddableForeignKeyDescriptor(
keyTableExpression,
bootValueMapping,
getPropertyOrder( bootValueMapping, creationProcess ),
parentSelectablePath,
creationProcess.getCreationContext().getMetadata(),
creationProcess.getCreationContext().getTypeConfiguration(),
insertable,
Expand Down Expand Up @@ -1214,6 +1220,15 @@ private static EmbeddedForeignKeyDescriptor buildEmbeddableForeignKeyDescriptor(
}
}

public static @Nullable SelectablePath getSelectablePath(ManagedMappingType type) {
if ( type instanceof EmbeddableMappingType ) {
final EmbeddableMappingType embeddableType = (EmbeddableMappingType) type;
return embeddableType.getAggregateMapping() != null
? embeddableType.getAggregateMapping().getSelectablePath() : null;
}
return null;
}

public static int[] getPropertyOrder(Value bootValueMapping, MappingModelCreationProcess creationProcess) {
final ComponentType componentType;
final boolean sorted;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import java.util.Locale;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.dialect.Dialect;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Selectable;
Expand Down Expand Up @@ -126,7 +127,7 @@ public static SelectableMapping from(
public static SelectableMapping from(
final String containingTableExpression,
final Selectable selectable,
final SelectablePath parentPath,
@Nullable final SelectablePath parentPath,
final JdbcMapping jdbcMapping,
final TypeConfiguration typeConfiguration,
boolean insertable,
Expand Down Expand Up @@ -154,7 +155,7 @@ public static SelectableMapping from(
public static SelectableMapping from(
final String containingTableExpression,
final Selectable selectable,
final SelectablePath parentPath,
@Nullable final SelectablePath parentPath,
final JdbcMapping jdbcMapping,
final TypeConfiguration typeConfiguration,
boolean insertable,
Expand Down
Loading
Loading