Created
November 19, 2025 08:50
-
-
Save rmb122/6fd24bdfdf815c1ff0fcc62116b1ea7a to your computer and use it in GitHub Desktop.
FieldOrderColumnOrderingStrategy order your columns by field define order
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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