Skip to content

Instantly share code, notes, and snippets.

@rmb122
Created November 19, 2025 08:50
Show Gist options
  • Select an option

  • Save rmb122/6fd24bdfdf815c1ff0fcc62116b1ea7a to your computer and use it in GitHub Desktop.

Select an option

Save rmb122/6fd24bdfdf815c1ff0fcc62116b1ea7a to your computer and use it in GitHub Desktop.
FieldOrderColumnOrderingStrategy order your columns by field define order
import org.hibernate.boot.Metadata;
import org.hibernate.boot.model.relational.ColumnOrderingStrategyLegacy;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Table;
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// hint: you need hibernate.ddl-auto = create-only / create / create-drop to make it take effect
@Configuration
public class FieldOrderColumnOrderingStrategy extends ColumnOrderingStrategyLegacy implements HibernatePropertiesCustomizer {
@Override
public void customize(Map<String, Object> hibernateProperties) {
hibernateProperties.put(AvailableSettings.COLUMN_ORDERING_STRATEGY, this);
}
@Override
public List<Column> orderTableColumns(Table table, Metadata metadata) {
PersistentClass persistentClass = metadata.getEntityBindings()
.stream()
.filter(x -> x.getTable().equals(table))
.findAny()
.orElse(null);
if (persistentClass == null) {
return null;
}
// column name -> field name
HashMap<String, String> columnMap = new HashMap<>();
HashMap<String, Integer> fieldOrder = new HashMap<>();
for (Property property : persistentClass.getProperties()) {
for (Column column : property.getColumns()) {
columnMap.put(column.getName(), property.getName());
}
}
Class<?> clazz = persistentClass.getMappedClass();
Field[] fields = clazz.getFields();
for (int i = 0; i < fields.length; i++) {
fieldOrder.put(fields[i].getName(), i);
}
return table.getColumns().stream().sorted((x, y) -> {
String xFieldName = columnMap.get(x.getName());
int xOrder;
if (xFieldName == null) {
xOrder = 0;
} else {
xOrder = fieldOrder.get(xFieldName);
}
String yFieldName = columnMap.get(y.getName());
int yOrder;
if (yFieldName == null) {
yOrder = 0;
} else {
yOrder = fieldOrder.get(yFieldName);
}
return xOrder - yOrder;
}).toList();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment