diff --git a/querydsl-sql/src/main/java/com/querydsl/sql/dml/AbstractMapper.java b/querydsl-sql/src/main/java/com/querydsl/sql/dml/AbstractMapper.java index ac6a5cc5f..6521565c1 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/dml/AbstractMapper.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/dml/AbstractMapper.java @@ -29,7 +29,7 @@ import com.querydsl.sql.RelationalPath; public abstract class AbstractMapper implements Mapper { protected Map> getColumns(RelationalPath path) { - Map> columns = Maps.newHashMap(); + Map> columns = Maps.newLinkedHashMap(); for (Path column : path.getColumns()) { columns.put(column.getMetadata().getName(), column); } diff --git a/querydsl-sql/src/main/java/com/querydsl/sql/dml/DefaultMapper.java b/querydsl-sql/src/main/java/com/querydsl/sql/dml/DefaultMapper.java index 970d11e6f..65f0b7fbb 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/dml/DefaultMapper.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/dml/DefaultMapper.java @@ -15,7 +15,7 @@ package com.querydsl.sql.dml; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import com.querydsl.core.QueryException; @@ -51,7 +51,7 @@ public class DefaultMapper extends AbstractMapper { @Override public Map, Object> createMap(RelationalPath entity, Object bean) { try { - Map, Object> values = new HashMap, Object>(); + Map, Object> values = new LinkedHashMap, Object>(); Class beanClass = bean.getClass(); Map> columns = getColumns(entity); for (Field beanField : ReflectionUtils.getFields(beanClass)) { diff --git a/querydsl-sql/src/test/java/com/querydsl/sql/dml/DefaultMapperTest.java b/querydsl-sql/src/test/java/com/querydsl/sql/dml/DefaultMapperTest.java index f464b5006..357443702 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/dml/DefaultMapperTest.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/dml/DefaultMapperTest.java @@ -3,7 +3,7 @@ package com.querydsl.sql.dml; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import java.util.Map; +import java.util.*; import org.junit.Test; @@ -31,4 +31,12 @@ public class DefaultMapperTest extends AbstractMapperTest { assertTrue(values.isEmpty()); } + @Test + public void PreservedColumnOrder() { + final Map> columns = DefaultMapper.DEFAULT.getColumns(emp); + final List expectedKeySet = Arrays.asList("id", "firstname", "lastname", + "salary", "datefield", "timefield", "superiorId"); + assertEquals(expectedKeySet, new ArrayList(columns.keySet())); + } + } diff --git a/querydsl-sql/src/test/java/com/querydsl/sql/dml/SQLInsertClauseTest.java b/querydsl-sql/src/test/java/com/querydsl/sql/dml/SQLInsertClauseTest.java index b8b34a30c..21481936b 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/dml/SQLInsertClauseTest.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/dml/SQLInsertClauseTest.java @@ -22,4 +22,17 @@ public class SQLInsertClauseTest { assertEquals(ImmutableList.of(1), sql.getBindings()); } + @Test + public void GetSQLWithPreservedColumnOrder() { + com.querydsl.sql.domain.QEmployee emp1 = new com.querydsl.sql.domain.QEmployee("emp1"); + SQLInsertClause insert = new SQLInsertClause(null, SQLTemplates.DEFAULT, emp1); + insert.populate(emp1); + + SQLBindings sql = insert.getSQL().get(0); + assertEquals("The order of columns in generated sql should be predictable", + "insert into EMPLOYEE (SALARY, SUPERIOR_ID, DATEFIELD, FIRSTNAME, TIMEFIELD, ID, LASTNAME)\n" + + "values (EMPLOYEE.SALARY, EMPLOYEE.SUPERIOR_ID, EMPLOYEE.DATEFIELD, EMPLOYEE.FIRSTNAME, " + + "EMPLOYEE.TIMEFIELD, EMPLOYEE.ID, EMPLOYEE.LASTNAME)", sql.getSQL()); + } + }