diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index c2c69b164..a2d902f13 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -727,7 +727,7 @@ public class BeanDescriptor implements BeanType, STreeType { String[] cols = indexDef.getColumns(); BeanProperty[] props = new BeanProperty[cols.length]; for (int i = 0; i < cols.length; i++) { - String propName = findBeanPath("", cols[i]); + String propName = findBeanPath("", "", cols[i]); if (propName == null) { return; } @@ -2472,13 +2472,16 @@ public class BeanDescriptor implements BeanType, STreeType { /** * Return the property path given the db table and column. */ - public String findBeanPath(String tableName, String columnName) { - if (tableName.isEmpty() || tableName.equalsIgnoreCase(baseTable)) { + public String findBeanPath(String schemaName, String tableName, String columnName) { + if (matchBaseTable(schemaName, tableName)) { return columnPath.get(columnName); } BeanPropertyAssoc assocProperty = tablePath.get(tableName); + if (assocProperty == null) { + assocProperty = tablePath.get(schemaName + "." + tableName); + } if (assocProperty != null) { - String relativePath = assocProperty.getTargetDescriptor().findBeanPath(tableName, columnName); + String relativePath = assocProperty.getTargetDescriptor().findBeanPath(schemaName, tableName, columnName); if (relativePath != null) { return SplitName.add(assocProperty.getName(), relativePath); } @@ -2486,6 +2489,12 @@ public class BeanDescriptor implements BeanType, STreeType { return null; } + private boolean matchBaseTable(String schemaName, String tableName) { + return tableName.isEmpty() + || baseTable.equalsIgnoreCase(tableName) + || baseTable.equalsIgnoreCase(schemaName + "." + tableName); + } + /** * Return a 'dynamic property' used to read a formula. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index 75aa7e3cc..ab008a5cf 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -442,9 +442,10 @@ class CQueryBuilder { int cols = 1 + metaData.getColumnCount(); List propertyNames = new ArrayList<>(cols - 1); for (int i = 1; i < cols; i++) { + String schemaName = metaData.getSchemaName(i).toLowerCase(); String tableName = metaData.getTableName(i).toLowerCase(); String columnName = metaData.getColumnName(i).toLowerCase(); - String path = desc.findBeanPath(tableName, columnName); + String path = desc.findBeanPath(schemaName, tableName, columnName); if (path != null) { propertyNames.add(path); } else { diff --git a/ebean-querybean/src/test/java/org/example/domain/Product.java b/ebean-querybean/src/test/java/org/example/domain/Product.java index e41d4fc34..ed58daa05 100644 --- a/ebean-querybean/src/test/java/org/example/domain/Product.java +++ b/ebean-querybean/src/test/java/org/example/domain/Product.java @@ -8,7 +8,7 @@ import javax.validation.constraints.Size; * Product entity bean. */ @Entity -@Table(name = "o_product") +@Table(name = "o_product", schema = "foo") public class Product extends BaseModel { @Size(max = 20) diff --git a/ebean-querybean/src/test/java/org/querytest/FindNative_withSchema.java b/ebean-querybean/src/test/java/org/querytest/FindNative_withSchema.java new file mode 100644 index 000000000..59146648d --- /dev/null +++ b/ebean-querybean/src/test/java/org/querytest/FindNative_withSchema.java @@ -0,0 +1,78 @@ +package org.querytest; + +import io.ebean.DB; +import org.example.domain.Customer; +import org.example.domain.Order; +import org.example.domain.OrderDetail; +import org.example.domain.Product; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FindNative_withSchema { + + @Test + public void test_rootLevelUsesSchema() { + + Product p = new Product(); + p.setName("prod1"); + p.setSku("p1"); + p.save(); + + String sql = "select * from foo.o_product p where p.sku = ?"; + + Product product = DB.findNative(Product.class, sql) + .setParameter("p1") + .findOne(); + + assertThat(product).isNotNull(); + assertThat(product.getName()).isEqualTo("prod1"); + } + + @Test + public void test_joinToSchema() { + + Order order = setupData(); + + String sql = "select l.*, p.* " + + " from o_order_detail l " + + " join foo.o_product p on p.id = l.product_id " + + " where l.order_id = ?"; + + List lines = DB.findNative(OrderDetail.class, sql) + .setParameter(order.getId()) + .findList(); + + assertThat(lines).hasSize(1); + OrderDetail line = lines.get(0); + Product product = line.getProduct(); + + // check normal bean population + assertThat(line.getOrderQty()).isEqualTo(10); + assertThat(line.getOrder().getId()).isEqualTo(order.getId()); + // check associated bean with schema is populated + assertThat(product).isNotNull(); + assertThat(product.getName()).isEqualTo("prod2"); + } + + private Order setupData() { + Product p = new Product(); + p.setName("prod2"); + p.setSku("p2"); + p.save(); + + Customer customer = new Customer(); + customer.setName("junk"); + customer.save(); + Order order = new Order(); + order.setCustomer(customer); + + OrderDetail line = new OrderDetail(p, 10, 10.0); + order.getDetails().add(line); + + order.save(); + return order; + } +} diff --git a/ebean-querybean/src/test/resources/application-test.properties b/ebean-querybean/src/test/resources/application-test.properties index 68e06a3f9..76f2d661f 100644 --- a/ebean-querybean/src/test/resources/application-test.properties +++ b/ebean-querybean/src/test/resources/application-test.properties @@ -1,5 +1,6 @@ ebean.ddl.generate=true ebean.ddl.run=true +ebean.ddl.initSql=init-db.sql datasource.default=h2 diff --git a/ebean-querybean/src/test/resources/init-db.sql b/ebean-querybean/src/test/resources/init-db.sql new file mode 100644 index 000000000..fde39032e --- /dev/null +++ b/ebean-querybean/src/test/resources/init-db.sql @@ -0,0 +1 @@ +create schema foo;