/** * INTERNAL * Build the context to be used when generating the expression from the parse tree */ public GenerationContext buildContext(DatabaseQuery query, AbstractSession sessionForContext) { if (query.isObjectLevelReadQuery()) { return buildContextForReadQuery(sessionForContext); } else if (query.isUpdateAllQuery() || query.isDeleteAllQuery()) { return new GenerationContext(getContext(), sessionForContext, this); } return null; }
/** * INTERNAL * Build the context to be used when generating the expression from the parse tree */ public GenerationContext buildContext(DatabaseQuery query, AbstractSession sessionForContext) { if (query.isObjectLevelReadQuery()) { return buildContextForReadQuery(sessionForContext); } else if (query.isUpdateAllQuery() || query.isDeleteAllQuery()) { return new GenerationContext(getContext(), sessionForContext, this); } return null; }
/** * INTERNAL * Build the context to be used when generating the expression from the parse tree */ public GenerationContext buildContext(DatabaseQuery query, AbstractSession sessionForContext) { if (query.isObjectLevelReadQuery()) { return buildContextForReadQuery(sessionForContext); } else if (query.isUpdateAllQuery() || query.isDeleteAllQuery()) { return new GenerationContext(getContext(), sessionForContext, this); } return null; }
@Override public int executeUpdate() { JpaQuery<T> jpaQuery = getQuery(); DatabaseQuery databaseQuery = jpaQuery.getDatabaseQuery(); Class referenceClass = databaseQuery.getReferenceClass(); boolean isDeleteQuery = databaseQuery.isDeleteObjectQuery() || databaseQuery.isDeleteAllQuery(); boolean enableDeleteInSoftDeleteMode = Boolean.parseBoolean(AppContext.getProperty("cuba.enableDeleteStatementInSoftDeleteMode")); if (!enableDeleteInSoftDeleteMode && entityManager.isSoftDeletion() && isDeleteQuery) { if (SoftDelete.class.isAssignableFrom(referenceClass)) { throw new UnsupportedOperationException("Delete queries are not supported with enabled soft deletion. " + "Use 'cuba.enableDeleteStatementInSoftDeleteMode' application property to roll back to legacy behavior."); } } // In some cache configurations (in particular, when shared cache is on, but for some entities cache is set to ISOLATED), // EclipseLink does not evict updated entities from cache automatically. Cache cache = jpaQuery.getEntityManager().getEntityManagerFactory().getCache(); if (referenceClass != null) { cache.evict(referenceClass); queryCacheMgr.invalidate(referenceClass, true); } else { cache.evictAll(); queryCacheMgr.invalidateAll(true); } preExecute(jpaQuery); return jpaQuery.executeUpdate(); }
/** * Add all of the relevant query settings from an EJBQLParseTree to the given * database query. * @param query The query to populate * @param session The session to use to information such as descriptors. */ public void populateQuery(DatabaseQuery query, AbstractSession session) { if (query.isObjectLevelReadQuery()) { ObjectLevelReadQuery objectQuery = (ObjectLevelReadQuery)query; GenerationContext generationContext = buildContext(objectQuery, session); populateReadQueryInternal(objectQuery, generationContext); } else if (query.isUpdateAllQuery()) { UpdateAllQuery updateQuery = (UpdateAllQuery)query; GenerationContext generationContext = buildContext(updateQuery, session); populateModifyQueryInternal(updateQuery, generationContext); addUpdatesToQuery(updateQuery, generationContext); } else if (query.isDeleteAllQuery()) { DeleteAllQuery deleteQuery = (DeleteAllQuery)query; GenerationContext generationContext = buildContext(deleteQuery, session); populateModifyQueryInternal(deleteQuery, generationContext); } }
/** * Add all of the relevant query settings from an EJBQLParseTree to the given * database query. * @param query The query to populate * @param session The session to use to information such as descriptors. */ public void populateQuery(DatabaseQuery query, AbstractSession session) { if (query.isObjectLevelReadQuery()) { ObjectLevelReadQuery objectQuery = (ObjectLevelReadQuery)query; GenerationContext generationContext = buildContext(objectQuery, session); populateReadQueryInternal(objectQuery, generationContext); } else if (query.isUpdateAllQuery()) { UpdateAllQuery updateQuery = (UpdateAllQuery)query; GenerationContext generationContext = buildContext(updateQuery, session); populateModifyQueryInternal(updateQuery, generationContext); addUpdatesToQuery(updateQuery, generationContext); } else if (query.isDeleteAllQuery()) { DeleteAllQuery deleteQuery = (DeleteAllQuery)query; GenerationContext generationContext = buildContext(deleteQuery, session); populateModifyQueryInternal(deleteQuery, generationContext); } }
/** * Add all of the relevant query settings from an EJBQLParseTree to the given * database query. * @param query The query to populate * @param session The session to use to information such as descriptors. */ public void populateQuery(DatabaseQuery query, AbstractSession session) { if (query.isObjectLevelReadQuery()) { ObjectLevelReadQuery objectQuery = (ObjectLevelReadQuery)query; GenerationContext generationContext = buildContext(objectQuery, session); populateReadQueryInternal(objectQuery, generationContext); } else if (query.isUpdateAllQuery()) { UpdateAllQuery updateQuery = (UpdateAllQuery)query; GenerationContext generationContext = buildContext(updateQuery, session); populateModifyQueryInternal(updateQuery, generationContext); addUpdatesToQuery(updateQuery, generationContext); } else if (query.isDeleteAllQuery()) { DeleteAllQuery deleteQuery = (DeleteAllQuery)query; GenerationContext generationContext = buildContext(deleteQuery, session); populateModifyQueryInternal(deleteQuery, generationContext); } }
/** * INTERNAL * Adjust the reference class of the passed query if necessary * * Need to test this for Employee, employee.getAddress(), report query */ public void adjustReferenceClassForQuery(DatabaseQuery theQuery, GenerationContext generationContext) { Class referenceClass = getReferenceClass(theQuery, generationContext); if ((referenceClass != null) && (referenceClass != theQuery.getReferenceClass())) { if (theQuery.isObjectLevelReadQuery()) { // The referenceClass needs to be changed. // This should only happen in an ejbSelect... ((ObjectLevelReadQuery)theQuery).setReferenceClass(referenceClass); generationContext.setBaseQueryClass(referenceClass); ((ObjectLevelReadQuery)theQuery).changeDescriptor(generationContext.getSession()); } else if (theQuery.isUpdateAllQuery()) { ((UpdateAllQuery)theQuery).setReferenceClass(referenceClass); } else if (theQuery.isDeleteAllQuery()) { ((DeleteAllQuery)theQuery).setReferenceClass(referenceClass); } } }
/** * INTERNAL * Adjust the reference class of the passed query if necessary * * Need to test this for Employee, employee.getAddress(), report query */ public void adjustReferenceClassForQuery(DatabaseQuery theQuery, GenerationContext generationContext) { Class referenceClass = getReferenceClass(theQuery, generationContext); if ((referenceClass != null) && (referenceClass != theQuery.getReferenceClass())) { if (theQuery.isObjectLevelReadQuery()) { // The referenceClass needs to be changed. // This should only happen in an ejbSelect... ((ObjectLevelReadQuery)theQuery).setReferenceClass(referenceClass); generationContext.setBaseQueryClass(referenceClass); ((ObjectLevelReadQuery)theQuery).changeDescriptor(generationContext.getSession()); } else if (theQuery.isUpdateAllQuery()) { ((UpdateAllQuery)theQuery).setReferenceClass(referenceClass); } else if (theQuery.isDeleteAllQuery()) { ((DeleteAllQuery)theQuery).setReferenceClass(referenceClass); } } }
/** * INTERNAL * Adjust the reference class of the passed query if necessary * * Need to test this for Employee, employee.getAddress(), report query */ public void adjustReferenceClassForQuery(DatabaseQuery theQuery, GenerationContext generationContext) { Class referenceClass = getReferenceClass(theQuery, generationContext); if ((referenceClass != null) && (referenceClass != theQuery.getReferenceClass())) { if (theQuery.isObjectLevelReadQuery()) { // The referenceClass needs to be changed. // This should only happen in an ejbSelect... ((ObjectLevelReadQuery)theQuery).setReferenceClass(referenceClass); generationContext.setBaseQueryClass(referenceClass); ((ObjectLevelReadQuery)theQuery).changeDescriptor(generationContext.getSession()); } else if (theQuery.isUpdateAllQuery()) { ((UpdateAllQuery)theQuery).setReferenceClass(referenceClass); } else if (theQuery.isDeleteAllQuery()) { ((DeleteAllQuery)theQuery).setReferenceClass(referenceClass); } } }