@Override public String extractQueryString(Query query) { return ((JpaQuery<?>) query).getDatabaseQuery().getJPQLString(); }
MetaClass metaClass = metadata.getClassNN(view.getEntityClass()); if (!metadata.getTools().isCacheable(metaClass) || !singleResultExpected) { query.setHint(QueryHints.REFRESH, HintValues.TRUE); query.setHint(QueryHints.REFRESH_CASCADE, CascadePolicy.CascadeByMapping); query.setFlushMode(FlushModeType.AUTO); } else { query.setFlushMode(FlushModeType.COMMIT); query.setFlushMode(flushMode); query.setHint(QueryHints.PREPARE, HintValues.FALSE); query.setMaxResults(maxResults); if (firstResult != null && !singleResultExpected) query.setFirstResult(firstResult); query.setLockMode(lockMode);
@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(); }
@SuppressWarnings("unchecked") @Override public <T> CloseableIterator<T> iterate(Query query, FactoryExpression<?> projection) { Iterator<T> iterator = null; Closeable closeable = null; if (query instanceof JpaQuery) { JpaQuery<T> elQuery = (JpaQuery<T>) query; elQuery.setHint(QueryHints.RESULT_SET_TYPE, ResultSetType.ForwardOnly); elQuery.setHint(QueryHints.SCROLLABLE_CURSOR, true); final Cursor cursor = elQuery.getResultCursor(); closeable = new Closeable() { @Override public void close() throws IOException { cursor.close(); } }; iterator = cursor; } else { iterator = query.getResultList().iterator(); } if (projection != null) { return new TransformingIterator<T>(iterator, closeable, projection); } else { return new IteratorAdapter<T>(iterator, closeable); } }
private void applyView(JpaQuery query, String queryString, AttributeGroup attrGroup, View view, boolean singleResultExpected) { boolean useFetchGroup = attrGroup instanceof FetchGroup; FetchGroupDescription description = calculateFetchGroup(queryString, view, singleResultExpected, useFetchGroup); if (attrGroup instanceof FetchGroup) ((FetchGroup) attrGroup).setShouldLoadAll(true); if (log.isTraceEnabled()) log.trace((useFetchGroup ? "Fetch" : "Load") + " group for " + view + ":\n" + description.getAttributes().stream().collect(Collectors.joining("\n"))); for (String attribute : description.getAttributes()) { attrGroup.addAttribute(attribute); } MetaClass metaClass = metadata.getClassNN(view.getEntityClass()); if (!metadataTools.isCacheable(metaClass)) { query.setHint(useFetchGroup ? QueryHints.FETCH_GROUP : QueryHints.LOAD_GROUP, attrGroup); } if (log.isDebugEnabled()) { String fetchModes = description.getHints().entrySet().stream() .map(e -> e.getKey() + "=" + (e.getValue().equals(QueryHints.LEFT_FETCH) ? "JOIN" : "BATCH")) .collect(Collectors.joining(", ")); log.debug("Fetch modes for " + view + ": " + (fetchModes.equals("") ? "<none>" : fetchModes)); } for (Map.Entry<String, String> entry : description.getHints().entrySet()) { query.setHint(entry.getValue(), entry.getKey()); } if (description.hasBatches()) { query.setHint(QueryHints.BATCH_TYPE, "IN"); } }
protected void preExecute(JpaQuery jpaQuery) { // copying behaviour of org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery() DatabaseQuery elDbQuery = ((EJBQueryImpl) jpaQuery).getDatabaseQueryInternal(); boolean isObjectLevelReadQuery = elDbQuery.isObjectLevelReadQuery(); if (jpaQuery.getFlushMode() == FlushModeType.AUTO && (!isObjectLevelReadQuery || !((ObjectLevelReadQuery) elDbQuery).isReadOnly())) { // flush is expected support.fireEntityListeners(entityManager, true); } }
public void addView(JpaQuery query, String queryString, View view, boolean singleResultExpected) { Preconditions.checkNotNullArgument(query, "query is null"); Preconditions.checkNotNullArgument(view, "view is null"); Map<String, Object> hints = query.getHints(); AttributeGroup ag = null; if (view.loadPartialEntities()) { if (hints != null) ag = (FetchGroup) hints.get(QueryHints.FETCH_GROUP); if (ag == null) ag = new FetchGroup(); } else { if (hints != null) ag = (LoadGroup) hints.get(QueryHints.LOAD_GROUP); if (ag == null) ag = new LoadGroup(); } applyView(query, queryString, ag, view, singleResultExpected); }
public void setView(JpaQuery query, String queryString, @Nullable View view, boolean singleResultExpected) { Preconditions.checkNotNullArgument(query, "query is null"); if (view != null) { AttributeGroup ag = view.loadPartialEntities() ? new FetchGroup() : new LoadGroup(); applyView(query, queryString, ag, view, singleResultExpected); } else { query.setHint(QueryHints.FETCH_GROUP, null); } }
/** * 実行結果がEJBQueryだった場合、getDatabaseQueryメソッドを実行してNamedQueryの存在チェックを行います。 * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation) */ public Object invoke(MethodInvocation invocation) throws Throwable { Object ret = invocation.proceed(); if (ret instanceof JpaQuery) { JpaQuery query = JpaQuery.class.cast(ret); query.getDatabaseQuery(); } return ret; }
/** * Access the internal EclipseLink query wrapped within the JPA query. */ public static DatabaseQuery getDatabaseQuery(Query query) { if (query instanceof JpaQuery) { return ((JpaQuery)query).getDatabaseQuery(); } throw new IllegalArgumentException(ExceptionLocalization.buildMessage("jpa_helper_invalid_query" + query.getClass())); }
public String extractQueryString(Query query) { return ((JpaQuery<?>) query).getDatabaseQuery().getJPQLString(); }