From 73b2cc55f358cc81bb274c745796e1fb7ee7b3d9 Mon Sep 17 00:00:00 2001
From: Rob Bygrave
diff --git a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java
index e0bbc9f0e..cbe3dc48f 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyAssoc.java
@@ -16,7 +16,7 @@ public abstract class DeployBeanPropertyAssoc
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
index d9452bc8f..d523bb739 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
@@ -38,6 +38,7 @@ import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssoc;
import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocMany;
import io.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne;
import io.ebeaninternal.server.deploy.meta.DeployBeanTable;
+import io.ebeaninternal.server.deploy.meta.DeployOrderColumn;
import io.ebeaninternal.server.deploy.meta.DeployTableJoin;
import io.ebeaninternal.server.deploy.parse.DeployBeanInfo;
import io.ebeaninternal.server.deploy.parse.DeployCreateProperties;
@@ -50,6 +51,7 @@ import io.ebeaninternal.server.properties.BeanPropertiesReader;
import io.ebeaninternal.server.properties.BeanPropertyAccess;
import io.ebeaninternal.server.properties.EnhanceBeanPropertyAccess;
import io.ebeaninternal.server.query.CQueryPlan;
+import io.ebeaninternal.server.type.ScalarTypeInteger;
import io.ebeaninternal.xmlmapping.XmlMappingReader;
import io.ebeaninternal.xmlmapping.model.XmAliasMapping;
import io.ebeaninternal.xmlmapping.model.XmColumnMapping;
@@ -979,6 +981,23 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
throw new PersistenceException(msg);
}
+ private void makeOrderColumn(DeployBeanPropertyAssocMany> oneToMany) {
+
+ DeployBeanDescriptor> targetDesc = getTargetDescriptor(oneToMany);
+
+ DeployOrderColumn orderColumn = oneToMany.getOrderColumn();
+ DeployBeanProperty orderProperty = new DeployBeanProperty(targetDesc, Integer.class, ScalarTypeInteger.INSTANCE, null);
+
+ orderProperty.setName(DeployOrderColumn.LOGICAL_NAME);
+ orderProperty.setDbColumn(orderColumn.getName());
+ orderProperty.setNullable(orderColumn.isNullable());
+ orderProperty.setDbInsertable(orderColumn.isInsertable());
+ orderProperty.setDbUpdateable(orderColumn.isUpdatable());
+ orderProperty.setDbRead(true);
+
+ targetDesc.setOrderColumn(orderProperty);
+ }
+
/**
* A OneToMany with no matching mappedBy property in the target so must be
* unidirectional.
@@ -1112,6 +1131,10 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
prop.getCascadeInfo().setSaveDelete(true, true);
}
+ if (prop.hasOrderColumn()) {
+ makeOrderColumn(prop);
+ }
+
if (prop.getMappedBy() == null) {
// if we are doc store only we are done
// this allowes the use of @OneToMany in @DocStore - Entities
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
index 1a04e8ef9..8f902c047 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
@@ -58,6 +58,11 @@ public class BeanPropertyAssocMany
@@ -93,6 +97,12 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
this(null, sql, new BindParams());
}
+ @Override
+ public Object executeGetKey() {
+ execute();
+ return getGeneratedKey();
+ }
+
@Override
public int execute() {
if (server != null) {
@@ -103,6 +113,16 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
}
}
+ @Override
+ public Object getGeneratedKey() {
+ return generatedKey;
+ }
+
+ @Override
+ public void setGeneratedKey(Object idValue) {
+ this.generatedKey = idValue;
+ }
+
@Override
public boolean isAutoTableMod() {
return isAutoTableMod;
@@ -125,6 +145,17 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
return this;
}
+ @Override
+ public boolean isGetGeneratedKeys() {
+ return getGeneratedKeys;
+ }
+
+ @Override
+ public SqlUpdate setGetGeneratedKeys(boolean getGeneratedKeys) {
+ this.getGeneratedKeys = getGeneratedKeys;
+ return this;
+ }
+
@Override
public String getGeneratedSql() {
return generatedSql;
diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java
index 52add1204..05fd26cd6 100644
--- a/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java
+++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java
@@ -73,6 +73,11 @@ public final class PersistRequestUpdateSql extends PersistRequest {
*/
@Override
public void setGeneratedKey(Object idValue) {
+ updateSql.setGeneratedKey(idValue);
+ }
+
+ public boolean isGetGeneratedKeys() {
+ return updateSql.isGetGeneratedKeys();
}
/**
diff --git a/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java b/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java
index 756111a72..3830096a6 100644
--- a/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java
+++ b/src/main/java/io/ebeaninternal/server/persist/ExeOrmUpdate.java
@@ -16,7 +16,7 @@ import java.sql.SQLException;
/**
* Executes the UpdateSql requests.
*/
-public class ExeOrmUpdate {
+class ExeOrmUpdate {
private static final Logger logger = LoggerFactory.getLogger(ExeOrmUpdate.class);
@@ -27,7 +27,7 @@ public class ExeOrmUpdate {
/**
* Create with a given binder.
*/
- public ExeOrmUpdate(Binder binder) {
+ ExeOrmUpdate(Binder binder) {
this.pstmtFactory = new PstmtFactory();
this.binder = binder;
}
@@ -107,7 +107,7 @@ public class ExeOrmUpdate {
if (logSql) {
t.logSql(sql);
}
- pstmt = pstmtFactory.getPstmt(t, sql);
+ pstmt = pstmtFactory.getPstmt(t, sql, false);
}
String bindLog = null;
diff --git a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java
index 7e265033a..b8e050783 100644
--- a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java
+++ b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java
@@ -6,17 +6,19 @@ import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.server.core.PersistRequestUpdateSql;
import io.ebeaninternal.server.core.PersistRequestUpdateSql.SqlType;
import io.ebeaninternal.server.util.BindParamsParser;
+import io.ebeaninternal.util.JdbcClose;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.PersistenceException;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Executes the UpdateSql requests.
*/
-public class ExeUpdateSql {
+class ExeUpdateSql {
private static final Logger logger = LoggerFactory.getLogger(ExeUpdateSql.class);
@@ -27,7 +29,7 @@ public class ExeUpdateSql {
/**
* Create with a given binder.
*/
- public ExeUpdateSql(Binder binder) {
+ ExeUpdateSql(Binder binder) {
this.binder = binder;
this.pstmtFactory = new PstmtFactory();
}
@@ -51,6 +53,9 @@ public class ExeUpdateSql {
} else {
int rowCount = pstmt.executeUpdate();
request.checkRowCount(rowCount);
+ if (request.isGetGeneratedKeys()) {
+ readGeneratedKeys(pstmt, request);
+ }
request.postExecute();
return rowCount;
}
@@ -68,6 +73,22 @@ public class ExeUpdateSql {
}
}
+ private void readGeneratedKeys(PreparedStatement stmt, PersistRequestUpdateSql request) {
+
+ ResultSet resultSet = null;
+ try {
+ resultSet = stmt.getGeneratedKeys();
+ if (resultSet.next()) {
+ request.setGeneratedKey(resultSet.getObject(1));
+ }
+ } catch (SQLException ex) {
+ throw new PersistenceException(ex);
+
+ } finally {
+ JdbcClose.close(resultSet);
+ }
+ }
+
private PreparedStatement bindStmt(PersistRequestUpdateSql request, boolean batchThisRequest) throws SQLException {
SpiSqlUpdate updateSql = request.getUpdateSql();
@@ -90,7 +111,7 @@ public class ExeUpdateSql {
if (logSql) {
t.logSql(TrimLogSql.trim(sql));
}
- pstmt = pstmtFactory.getPstmt(t, sql);
+ pstmt = pstmtFactory.getPstmt(t, sql, request.isGetGeneratedKeys());
}
if (updateSql.getTimeout() > 0) {
diff --git a/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java b/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java
index 6655e4cbb..df1c348b1 100644
--- a/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java
+++ b/src/main/java/io/ebeaninternal/server/persist/PstmtFactory.java
@@ -6,6 +6,7 @@ import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
+import java.sql.Statement;
/**
* Factory for creating Statements.
@@ -14,9 +15,9 @@ import java.sql.SQLException;
* getGeneratedKeys.
*
+ * In general we don't want to do that as when we use a distributed cache (like Ignite, Hazelcast etc)
+ * we are making network calls and we prefer to do this in background and not impact the response time
+ * of the executing transaction.
+ * {@code
+ *
+ * sqlUpdate.execute();
+ * Object key = sqlUpdate.getGeneratedKey();
+ *
+ * }
+ *
+ * @return The generated key value
+ */
+ Object executeGetKey();
+
/**
* Return true if eBean should automatically deduce the table modification
* information and process it.
@@ -88,6 +107,11 @@ public interface SqlUpdate {
*/
SqlUpdate setLabel(String label);
+ /**
+ * Set to true when we want to use getGeneratedKeys with this statement.
+ */
+ SqlUpdate setGetGeneratedKeys(boolean getGeneratedKeys);
+
/**
* Return the sql statement.
*/
diff --git a/src/main/java/io/ebeaninternal/api/SpiSqlUpdate.java b/src/main/java/io/ebeaninternal/api/SpiSqlUpdate.java
index d9da393c8..10c7ccad7 100644
--- a/src/main/java/io/ebeaninternal/api/SpiSqlUpdate.java
+++ b/src/main/java/io/ebeaninternal/api/SpiSqlUpdate.java
@@ -4,7 +4,23 @@ import io.ebean.SqlUpdate;
public interface SpiSqlUpdate extends SqlUpdate {
+ /**
+ * Return the Bind parameters.
+ */
BindParams getBindParams();
+ /**
+ * Set the final sql being executed with named parameters replaced etc.
+ */
void setGeneratedSql(String sql);
+
+ /**
+ * Return true if we are using getGeneratedKeys.
+ */
+ boolean isGetGeneratedKeys();
+
+ /**
+ * Set the generated key value.
+ */
+ void setGeneratedKey(Object idValue);
}
diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
index ea8a4c3cc..c65b6c269 100644
--- a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
+++ b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
@@ -65,6 +65,10 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
*/
private int addPos;
+ private boolean getGeneratedKeys;
+
+ private Object generatedKey;
+
/**
* Create with server sql and bindParams object.
*
diff --git a/src/main/java/io/ebean/common/AbstractBeanCollection.java b/src/main/java/io/ebean/common/AbstractBeanCollection.java
index d02c0ffc7..866d8d0c0 100644
--- a/src/main/java/io/ebean/common/AbstractBeanCollection.java
+++ b/src/main/java/io/ebean/common/AbstractBeanCollection.java
@@ -140,6 +140,11 @@ abstract class AbstractBeanCollection
+ * For example, when inserting a bean with a cascade on a OneToMany with many
+ * beans Ebean can call this to ensure .
+ *
diff --git a/src/main/java/io/ebean/QueryType.java b/src/main/java/io/ebean/QueryType.java
new file mode 100644
index 000000000..4c167ac7d
--- /dev/null
+++ b/src/main/java/io/ebean/QueryType.java
@@ -0,0 +1,22 @@
+package io.ebean;
+
+/**
+ * The type of the query being executed.
+ */
+public enum QueryType {
+
+ /**
+ * A find query.
+ */
+ FIND,
+
+ /**
+ * An update query.
+ */
+ UPDATE,
+
+ /**
+ * A delete query.
+ */
+ DELETE
+}
diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
index bc14d10d7..a7aef2d50 100644
--- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
+++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
@@ -17,6 +17,7 @@ import io.ebean.PersistenceContextScope;
import io.ebean.ProfileLocation;
import io.ebean.Query;
import io.ebean.QueryIterator;
+import io.ebean.QueryType;
import io.ebean.RawSql;
import io.ebean.Version;
import io.ebean.bean.CallStack;
@@ -914,6 +915,19 @@ public class DefaultOrmQuery
+ * Note that typically users would extend BeanRepository rather than BeanFinder.
+ *
+ * This is equivalent to {@link Ebean#getServer(String)}
+ *
+ * @param server The name of the EbeanServer. If this is null then the default EbeanServer is
+ * returned.
+ */
+ public EbeanServer db(String server) {
+ return Ebean.getServer(server);
+ }
+
+ /**
+ * Creates an entity reference for this ID.
+ *
+ * Equivalent to {@link EbeanServer#getReference(Class, Object)}
+ */
+ @Nonnull
+ public T ref(I id) {
+ return db().getReference(type, id);
+ }
+
+ /**
+ * Retrieves an entity by ID.
+ *
+ * Equivalent to {@link EbeanServer#find(Class, Object)}
+ */
+ @Nullable
+ public T findById(I id) {
+ return db().find(type, id);
+ }
+
+ /**
+ * Find an entity by ID returning an Optional.
+ */
+ @Nullable
+ public Optional
+ * Equivalent to {@link EbeanServer#delete(Class, Object)}
+ */
+ public void deleteById(I id) {
+ db().delete(type, id);
+ }
+
+ /**
+ * Retrieves all entities of the given type.
+ */
+ @Nonnull
+ public List
+ * Equivalent to {@link EbeanServer#update(Class)}
+ */
+ protected UpdateQuery
+ * Equivalent to {@link EbeanServer#find(Class)}
+ */
+ protected Query
+ *
+ * Typically users would extend BeanRepository rather than BeanFinder.
+ *
+ * This is used so that when a bean that is otherwise unmodified is updated the version
+ * property is updated.
+ *
+ * An unmodified bean that is saved or updated is normally skipped and this marks the bean as
+ * dirty so that it is not skipped.
+ *
+ *
+ * This would be used to specify a property that we did not wish to include in a stateless update.
+ *
+ * Ebean will detect if this is a new bean or a previously fetched bean and perform either an
+ * insert or an update based on that.
+ *
+ * @see EbeanServer#save(Object)
+ */
+ public void save(T bean) {
+ db().save(bean);
+ }
+
+ /**
+ * Update this entity.
+ *
+ * @see EbeanServer#update(Object)
+ */
+ public void update(T bean) {
+ db().update(bean);
+ }
+
+ /**
+ * Insert this entity.
+ *
+ * @see EbeanServer#insert(Object)
+ */
+ public void insert(T bean) {
+ db().insert(bean);
+ }
+
+ /**
+ * Delete this bean.
+ *
+ * This will return true if the bean was deleted successfully or JDBC batch is being used.
+ *
+ * If there is no current transaction one will be created and committed for
+ * you automatically.
+ *
+ * If the Bean does not have a version property (or loaded version property) and
+ * the bean does not exist then this returns false indicating that nothing was
+ * deleted. Note that, if JDBC batch mode is used then this always returns true.
+ *
+ * This is used when the bean contains a {@code
+ *
+ * public class CustomerFinder extends BeanFinder
+ *
+ * @param The ID type
+ * @param {@code
+ *
+ * int rows =
+ * updateQuery()
+ * .set("status", Customer.Status.ACTIVE)
+ * .set("updtime", new Timestamp(System.currentTimeMillis()))
+ * .where()
+ * .gt("id", 1000)
+ * .update();
+ *
+ * }
+ *
+ * {@code
+ *
+ * @Repository
+ * public class CustomerRepository extends BeanRepository
+ *
+ * @param The ID type
+ * @param {@code
+ *
+ * @Inject
+ * public CustomerRepository(EbeanServer server) {
+ * super(Customer.class, server);
+ * }
+ *
+ * }
+ *
+ * @param type The bean type
+ * @param server The EbeanServer instance typically created via Spring factory or equivalent
+ */
+ protected BeanRepository(Class{@code
+ *
+ * Customer customer = customerRepository.byId(id);
+ *
+ * // mark the bean as dirty so that a save() or update() will
+ * // increment the version property
+ *
+ * customerRepository.markAsDirty(customer);
+ * customerRepository.save(customer);
+ *
+ * }
+ *
+ * @see EbeanServer#markAsDirty(Object)
+ */
+ public void markAsDirty(T bean) {
+ db().markAsDirty(bean);
+ }
+
+ /**
+ * Mark the property as unset or 'not loaded'.
+ * {@code
+ *
+ * // populate an entity bean from JSON or whatever
+ * Customer customer = ...;
+ *
+ * // mark the email property as 'unset' so that it is not
+ * // included in a 'stateless update'
+ * customerRepository.markPropertyUnset(customer, "email");
+ *
+ * customerRepository.update(customer);
+ *
+ * }
+ *
+ * @param propertyName the name of the property on the bean to be marked as 'unset'
+ */
+ public void markPropertyUnset(T bean, String propertyName) {
+ ((EntityBean) bean)._ebean_getIntercept().setPropertyLoaded(propertyName, false);
+ }
+
+ /**
+ * Insert or update this entity depending on its state.
+ * @SoftDelete property and we
+ * want to perform a hard/permanent delete.
+ *
+ * Use this when you want to add preconfigured database platforms. + *
+ */ + void addDatabasePlatform(DatabasePlatform databasePlatform, String prefix); + /** * Generate the next migration xml file and associated apply and rollback sql scripts. *diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index a8d4877c9..9bf36c631 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -183,6 +183,11 @@ public class DefaultDbMigration implements DbMigration { platforms.add(new Pair(getPlatform(platform), prefix)); } + @Override + public void addDatabasePlatform(DatabasePlatform databasePlatform, String prefix) { + platforms.add(new Pair(databasePlatform, prefix)); + } + /** * Generate the next migration xml file and associated apply and rollback sql scripts. *
diff --git a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
index 6ea8a19e3..6d16f0d1c 100644
--- a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
+++ b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
@@ -4,6 +4,9 @@ import io.ebean.EbeanServer;
import io.ebean.EbeanServerFactory;
import io.ebean.annotation.Platform;
import io.ebean.config.ServerConfig;
+import io.ebean.config.dbplatform.DatabasePlatform;
+import io.ebean.config.dbplatform.IdType;
+import io.ebean.config.dbplatform.sqlserver.SqlServerPlatform;
import org.junit.*;
import org.slf4j.Logger;
@@ -52,7 +55,11 @@ public class DbMigrationGenerateTest {
migration.addPlatform(Platform.POSTGRES, "postgres");
migration.addPlatform(Platform.ORACLE, "oracle");
migration.addPlatform(Platform.SQLITE, "sqlite");
- migration.addPlatform(Platform.SQLSERVER, "sqlserver");
+
+ // we need sequence here, so that migration will work properly
+ DatabasePlatform sqlServer = new SqlServerPlatform();
+ sqlServer.getDbIdentity().setIdType(IdType.SEQUENCE);
+ migration.addDatabasePlatform(sqlServer, "sqlserver");
ServerConfig config = new ServerConfig();
config.setName("migrationtest");
From e751f991cba1125d1b15948eac9b77e9c5428778 Mon Sep 17 00:00:00 2001
From: Rob Bygrave
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
index 618183220..9d8c6fbe6 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java
@@ -52,7 +52,9 @@ import io.ebeaninternal.server.properties.BeanPropertiesReader;
import io.ebeaninternal.server.properties.BeanPropertyAccess;
import io.ebeaninternal.server.properties.EnhanceBeanPropertyAccess;
import io.ebeaninternal.server.query.CQueryPlan;
+import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarTypeInteger;
+import io.ebeaninternal.server.type.TypeManager;
import io.ebeaninternal.xmlmapping.XmlMappingReader;
import io.ebeaninternal.xmlmapping.model.XmAliasMapping;
import io.ebeaninternal.xmlmapping.model.XmColumnMapping;
@@ -139,6 +141,8 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
private final MultiValueBind multiValueBind;
+ private final TypeManager typeManager;
+
private int entityBeanCount;
private final boolean updateChangesOnly;
@@ -222,6 +226,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
this.dbIdentity = config.getDatabasePlatform().getDbIdentity();
this.deplyInherit = config.getDeployInherit();
this.deployUtil = config.getDeployUtil();
+ this.typeManager = deployUtil.getTypeManager();
this.beanManagerFactory = new BeanManagerFactory(config.getDatabasePlatform());
@@ -260,6 +265,11 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
}
}
+ @Override
+ public ScalarType> getScalarType(int jdbcType) {
+ return typeManager.getScalarType(jdbcType);
+ }
+
/**
* Return the AsOfViewSuffix based on the DbHistorySupport.
*/
@@ -1463,7 +1473,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap {
prop.setGetter(beanPropertyAccess.getGetter(propertyIndex));
prop.setSetter(beanPropertyAccess.getSetter(propertyIndex));
if (prop.isAggregation()) {
- prop.setAggregationPrefix(DetermineAggPath.manyPath(prop.getAggregation(), desc));
+ prop.setAggregationPrefix(DetermineAggPath.manyPath(prop.getRawAggregation(), desc));
}
}
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java
index 2cb357a2e..9d8387565 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java
@@ -6,6 +6,7 @@ import io.ebean.config.ServerConfig;
import io.ebeaninternal.server.cache.SpiCacheManager;
import io.ebeaninternal.server.deploy.id.IdBinder;
import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor;
+import io.ebeaninternal.server.type.ScalarType;
import io.ebeanservice.docstore.api.DocStoreBeanAdapter;
/**
@@ -60,4 +61,9 @@ public interface BeanDescriptorMap {
* Create a doc store specific adapter for this bean type.
*/
+ * We effectively use the underlying ORM query to build the SQL and then execute
+ * and map it into DTO beans.
+ */
+