mirror of https://github.com/apache/openjpa.git
OPENJPA-1577: disable query cache when user-defined field strategy is used.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@924055 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3b15fe9e2d
commit
41ce320cc0
|
@ -27,6 +27,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.openjpa.jdbc.meta.ClassMapping;
|
import org.apache.openjpa.jdbc.meta.ClassMapping;
|
||||||
|
import org.apache.openjpa.jdbc.meta.FieldMapping;
|
||||||
import org.apache.openjpa.jdbc.meta.MappingRepository;
|
import org.apache.openjpa.jdbc.meta.MappingRepository;
|
||||||
import org.apache.openjpa.jdbc.schema.Column;
|
import org.apache.openjpa.jdbc.schema.Column;
|
||||||
import org.apache.openjpa.jdbc.sql.LogicalUnion;
|
import org.apache.openjpa.jdbc.sql.LogicalUnion;
|
||||||
|
@ -177,6 +178,10 @@ public class PreparedQueryImpl implements PreparedQuery {
|
||||||
SQLBuffer buffer = selector.getSQL();
|
SQLBuffer buffer = selector.getSQL();
|
||||||
if (buffer == null)
|
if (buffer == null)
|
||||||
return new PreparedQueryCacheImpl.StrongExclusion(_id, _loc.get("exclude-no-sql", _id).getMessage());;
|
return new PreparedQueryCacheImpl.StrongExclusion(_id, _loc.get("exclude-no-sql", _id).getMessage());;
|
||||||
|
boolean useFieldStrategy = isUsingFieldStrategy();
|
||||||
|
if (useFieldStrategy)
|
||||||
|
return new PreparedQueryCacheImpl.StrongExclusion(_id,
|
||||||
|
_loc.get("exclude-user-strategy", _id).getMessage());;
|
||||||
setTargetQuery(buffer.getSQL());
|
setTargetQuery(buffer.getSQL());
|
||||||
setParameters(buffer.getParameters());
|
setParameters(buffer.getParameters());
|
||||||
setUserParameterPositions(buffer.getUserParameters());
|
setUserParameterPositions(buffer.getUserParameters());
|
||||||
|
@ -253,7 +258,28 @@ public class PreparedQueryImpl implements PreparedQuery {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isUsingFieldStrategy() {
|
||||||
|
for (int i = 0; i < _exps.length; i++) {
|
||||||
|
if (isUsingFieldStrategy(_exps[i])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUsingFieldStrategy(QueryExpressions exp) {
|
||||||
|
if (exp == null)
|
||||||
|
return false;
|
||||||
|
List<FieldMetaData> fmds = exp.getParameterizedFields();
|
||||||
|
if (fmds == null || fmds.isEmpty())
|
||||||
|
return false;
|
||||||
|
for (FieldMetaData fmd : fmds) {
|
||||||
|
if (((FieldMapping)fmd).getMappingInfo().getStrategy() != null)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merge the given user parameters with its own parameter. The given map
|
* Merge the given user parameters with its own parameter. The given map
|
||||||
|
|
|
@ -166,4 +166,6 @@ exclude-not-select-rop: Query "{0}" is not cached because its result \
|
||||||
exclude-not-executor: Query "{0}" is not cached because it was not executed on a \
|
exclude-not-executor: Query "{0}" is not cached because it was not executed on a \
|
||||||
data store.
|
data store.
|
||||||
exclude-externalized-param: Query "{0}" is not cached because some parameterized \
|
exclude-externalized-param: Query "{0}" is not cached because some parameterized \
|
||||||
field values are externalized.
|
field values are externalized.
|
||||||
|
exclude-user-strategy: This query "{0}" is not cached because some parameterized \
|
||||||
|
field value depends on user-defined field strategy.
|
|
@ -21,6 +21,8 @@ package org.apache.openjpa.persistence.jdbc.annotations;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.persistence.Query;
|
||||||
|
|
||||||
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
|
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
|
||||||
import org.apache.openjpa.jdbc.meta.ClassMapping;
|
import org.apache.openjpa.jdbc.meta.ClassMapping;
|
||||||
import org.apache.openjpa.jdbc.meta.Discriminator;
|
import org.apache.openjpa.jdbc.meta.Discriminator;
|
||||||
|
@ -327,5 +329,17 @@ public class TestNonstandardMappingAnnotations
|
||||||
assertEquals("name1", pc.getName());
|
assertEquals("name1", pc.getName());
|
||||||
assertEquals(1.0, pc.getPoint().getX());
|
assertEquals(1.0, pc.getPoint().getX());
|
||||||
assertEquals(2.0, pc.getPoint().getY());
|
assertEquals(2.0, pc.getPoint().getY());
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
Query query = em.createQuery("select s from NonstandardMappingEntity4 s where s.point = :point");
|
||||||
|
query.setParameter("point", new Point(1, 2));
|
||||||
|
java.util.List<NonstandardMappingEntity4> list = query.getResultList();
|
||||||
|
for (NonstandardMappingEntity4 pc1 : list) {
|
||||||
|
assertEquals(1.0, pc1.getPoint().getX());
|
||||||
|
assertEquals(2.0, pc1.getPoint().getY());
|
||||||
|
}
|
||||||
|
em.clear();
|
||||||
|
}
|
||||||
|
|
||||||
em.close();
|
em.close();
|
||||||
}}
|
}}
|
||||||
|
|
Loading…
Reference in New Issue