diff --git a/src/main/java/com/avaje/ebean/RawSql.java b/src/main/java/com/avaje/ebean/RawSql.java index 048532af9..58aeee862 100644 --- a/src/main/java/com/avaje/ebean/RawSql.java +++ b/src/main/java/com/avaje/ebean/RawSql.java @@ -404,7 +404,7 @@ public final class RawSql implements Serializable { this.dbColumnMap = new LinkedHashMap(); for (int i = 0; i < columns.size(); i++) { Column c = columns.get(i); - dbColumnMap.put(c.getDbColumn(), c); + dbColumnMap.put(c.getDbColumnKey(), c); } } @@ -500,8 +500,7 @@ public final class RawSql implements Serializable { } else { Column column = dbColumnMap.get(dbColumn); if (column == null) { - String msg = "DB Column [" + dbColumn + "] not found in mapping. Expecting one of [" - + dbColumnMap.keySet() + "]"; + String msg = "DB Column [" + dbColumn + "] not found in mapping. Expecting one of [" + dbColumnMap.keySet() + "]"; throw new IllegalArgumentException(msg); } column.setPropertyName(propertyName); @@ -657,6 +656,14 @@ public final class RawSql implements Serializable { return indexPos; } + /** + * Return the DB column alias if specified otherwise DB column. + * This is used as the key for mapping a column to a logical property. + */ + public String getDbColumnKey() { + return (dbAlias != null) ? dbAlias : dbColumn; + } + /** * Return the DB column name including table alias (if it has one). */ @@ -664,13 +671,6 @@ public final class RawSql implements Serializable { return dbColumn; } - /** - * Return the DB column alias (if it has one). - */ - public String getDbAlias() { - return dbAlias; - } - /** * Return the bean property this column is mapped to. */ diff --git a/src/test/java/com/avaje/ebean/TestRawSqlColumnParsing.java b/src/test/java/com/avaje/ebean/TestRawSqlColumnParsing.java index e297c71c2..f38498d56 100644 --- a/src/test/java/com/avaje/ebean/TestRawSqlColumnParsing.java +++ b/src/test/java/com/avaje/ebean/TestRawSqlColumnParsing.java @@ -60,29 +60,29 @@ public class TestRawSqlColumnParsing extends TestCase { assertEquals(5, mapping.size()); - Column c = mapping.get("a"); + Column c = mapping.get("a0"); assertEquals("a",c.getDbColumn()); assertEquals(0, c.getIndexPos()); assertEquals("a0",c.getPropertyName()); - c = mapping.get("b"); + c = mapping.get("b1"); assertEquals("b",c.getDbColumn()); assertEquals(1, c.getIndexPos()); assertEquals("b1",c.getPropertyName()); - c = mapping.get("c"); + c = mapping.get("c2"); assertEquals("c",c.getDbColumn()); assertEquals(2, c.getIndexPos()); assertEquals("c2",c.getPropertyName()); - c = mapping.get("d"); + c = mapping.get("d3"); assertEquals("d",c.getDbColumn()); assertEquals(3, c.getIndexPos()); assertEquals("d3",c.getPropertyName()); - c = mapping.get("e"); + c = mapping.get("e4"); assertEquals("e",c.getDbColumn()); assertEquals(4, c.getIndexPos()); assertEquals("e4",c.getPropertyName()); @@ -96,29 +96,29 @@ public class TestRawSqlColumnParsing extends TestCase { assertEquals(5, mapping.size()); - Column c = mapping.get("a"); + Column c = mapping.get("a0"); assertEquals("a",c.getDbColumn()); assertEquals(0, c.getIndexPos()); assertEquals("a0",c.getPropertyName()); - c = mapping.get("b"); + c = mapping.get("b1"); assertEquals("b",c.getDbColumn()); assertEquals(1, c.getIndexPos()); assertEquals("b1",c.getPropertyName()); - c = mapping.get("MONTH(MAKEDATE(2015, 241))"); + c = mapping.get("m2"); assertEquals("MONTH(MAKEDATE(2015, 241))",c.getDbColumn()); assertEquals(2, c.getIndexPos()); assertEquals("m2",c.getPropertyName()); - c = mapping.get("d"); + c = mapping.get("d3"); assertEquals("d",c.getDbColumn()); assertEquals(3, c.getIndexPos()); assertEquals("d3",c.getPropertyName()); - c = mapping.get("e"); + c = mapping.get("e4"); assertEquals("e",c.getDbColumn()); assertEquals(4, c.getIndexPos()); assertEquals("e4",c.getPropertyName()); @@ -132,29 +132,29 @@ public class TestRawSqlColumnParsing extends TestCase { assertEquals(5, mapping.size()); - Column c = mapping.get("a"); + Column c = mapping.get("a0"); assertEquals("a",c.getDbColumn()); assertEquals(0, c.getIndexPos()); assertEquals("a0",c.getPropertyName()); - c = mapping.get("'b'"); + c = mapping.get("b1"); assertEquals("'b'",c.getDbColumn()); assertEquals(1, c.getIndexPos()); assertEquals("b1",c.getPropertyName()); - c = mapping.get("\"c(blah)\""); + c = mapping.get("c2"); assertEquals("\"c(blah)\"",c.getDbColumn()); assertEquals(2, c.getIndexPos()); assertEquals("c2",c.getPropertyName()); - c = mapping.get("d"); + c = mapping.get("d3"); assertEquals("d",c.getDbColumn()); assertEquals(3, c.getIndexPos()); assertEquals("d3",c.getPropertyName()); - c = mapping.get("e"); + c = mapping.get("e4"); assertEquals("e",c.getDbColumn()); assertEquals(4, c.getIndexPos()); assertEquals("e4",c.getPropertyName()); diff --git a/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java b/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java index 8337e57d2..ddcf8cf98 100644 --- a/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java +++ b/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java @@ -2,6 +2,7 @@ package com.avaje.tests.basic; import java.util.List; +import com.avaje.ebean.Query; import com.avaje.ebean.RawSql; import com.avaje.ebean.RawSqlBuilder; import org.junit.Assert; @@ -12,6 +13,8 @@ import com.avaje.ebean.Ebean; import com.avaje.tests.model.basic.OrderAggregate; import com.avaje.tests.model.basic.ResetBasicData; +import static org.assertj.core.api.Assertions.assertThat; + public class TestOrderTotalAmountReportBean extends BaseTestCase { @Test @@ -46,4 +49,29 @@ public class TestOrderTotalAmountReportBean extends BaseTestCase { } + @Test + public void test_when_explicitMapping() { + + ResetBasicData.reset(); + + String sql = + "select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount \n" + + "from o_order_detail \n" + + "group by order_id"; + + RawSql rawSql = RawSqlBuilder.parse(sql) + .columnMapping("order_id", "order.id") + .columnMapping("total_items", "totalItems") + .columnMapping("total_amount", "totalAmount") + .create(); + + Query query = Ebean.find(OrderAggregate.class) + .setRawSql(rawSql); + + query.findList(); + + assertThat(query.getGeneratedSql()).contains("count(*) as total_items, sum(order_qty*unit_price) as total_amount"); + } + + } diff --git a/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java b/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java index a87a88a17..2428626e7 100644 --- a/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java +++ b/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java @@ -1,16 +1,16 @@ package com.avaje.tests.query; -import java.util.List; - -import com.avaje.ebean.RawSql; -import com.avaje.ebean.RawSqlBuilder; -import org.junit.Assert; -import org.junit.Test; - import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; +import com.avaje.ebean.Query; +import com.avaje.ebean.RawSql; +import com.avaje.ebean.RawSqlBuilder; import com.avaje.tests.model.basic.MyAdHoc; import com.avaje.tests.model.basic.ResetBasicData; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; public class TestMyAdHocSqlSelect extends BaseTestCase { @@ -20,12 +20,44 @@ public class TestMyAdHocSqlSelect extends BaseTestCase { ResetBasicData.reset(); String sql = "select order_id, count(*) as detailCount from o_order_detail group by order_id"; - RawSql rawSql = RawSqlBuilder.parse(sql).columnMapping("order_id", "order.id").create(); - List list = Ebean.find(MyAdHoc.class).setRawSql(rawSql).where().gt("order_id", 0).having() - .gt("detailCount", 0).findList(); + RawSql rawSql = RawSqlBuilder + .parse(sql) + .columnMapping("order_id", "order.id") + .create(); - Assert.assertNotNull(list); + Query query = Ebean.find(MyAdHoc.class) + .setRawSql(rawSql) + .where().gt("order_id", 0) + .having().gt("detailCount", 0) + .query(); + + assertNotNull(query.findList()); + assertThat(query.getGeneratedSql()).contains(" group by order_id having count(*) > ?"); } + @Test + public void test_when_explicitColumnMapping() { + + ResetBasicData.reset(); + + String sql = "select order_id, count(*) as detail_count from o_order_detail group by order_id"; + + RawSql rawSql = RawSqlBuilder + .parse(sql) + .columnMapping("order_id", "order.id") + .columnMapping("detail_count", "detailCount") + .create(); + + Query query = Ebean.find(MyAdHoc.class) + .setRawSql(rawSql) + .where().gt("order_id", 0) + .having().gt("detailCount", 0) + .query(); + + assertNotNull(query.findList()); + assertThat(query.getGeneratedSql()).contains(" group by order_id having count(*) > ?"); + } + + }