DatabaseQuery databaseQuery = null;
if (isCacheable) {
databaseQuery = (DatabaseQuery)session.getProject().getJPQLParseCache().get(jpql);
}
if ((databaseQuery == null) || (!databaseQuery.isPrepared())) {
JPQLParseTree parseTree = JPQLParser.buildParseTree(queryName, jpql);
parseTree.setClassLoader(classLoader);
databaseQuery = parseTree.createDatabaseQuery();
databaseQuery.setJPQLString(jpql);
parseTree.populateQuery(databaseQuery, (AbstractSession)session);
// If the query uses fetch joins, need to use JPA default of not filtering duplicates.
if (databaseQuery.isReadAllQuery()) {
ReadAllQuery readAllQuery = (ReadAllQuery)databaseQuery;
if (readAllQuery.hasJoining() && (readAllQuery.getDistinctState() == ReadAllQuery.DONT_USE_DISTINCT)) {
readAllQuery.setShouldFilterDuplicates(false);
}
}
// Bug#4646580 Add arguments to query.
parseTree.addParametersToQuery(databaseQuery);
((JPQLCallQueryMechanism)databaseQuery.getQueryMechanism()).getJPQLCall().setIsParsed(true);
databaseQuery.setFlushOnExecute(flushOnExecute);
//GF#1324 eclipselink.refresh query hint does not cascade
//cascade by mapping as default for read query