我在Spring Data JPA存储库中创建了查询方法。我使用了方法命名约定。 我不确定,但看起来Spring Data为它做了查询缓存。我有那些实体:
public class Feature {
private String desc;
private FeatureFor featureFo;
}
public enum FeatureFor {
ABC, DEF, XYZ;
}
在存储库中,我创建了名称为
的方法public List<Feature> findByFeatureForIn(List<FeatureFor> featureFors);
此方法从不同的服务中调用两次。 第一次调用它时,我可以在控制台中看到生成的查询,如下所示:
SELECT ...... WHERE ((t0.featureFor = ? OR t0.featureFor = ?) AND t0.featureFor IS NOT NULL) [params=(String) ABC, (String) DEF]
这没关系。但是当通过第二个服务调用方法时,我可以看到使用相同参数生成的相同select。我确信在featureFors参数中有ABC和XYZ。但它完全被忽略了。我还尝试使用featureFors,其中包含一个ABC值(在第一个调用的服务中)。在这种情况下,生成的查询是这样的:
SELECT ...... WHERE (t0.featureFor = ? AND t0.featureFor IS NOT NULL) [params=(String) ABC, (String) DEF]
第二个服务传递了相同的参数(ABC和XYZ),但生成的查询和参数没有改变(它与第一个服务中生成的相同)。有人知道Spring Data是否为查询创建了缓存吗?我没有意识到我犯了一些错误。也许我做到了。我正在使用OpenJPA。谢谢你的帮助。
持久性配置如下所示:
<?xml version="1.0"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="openjpa">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>...difened entities here (including Feature)...</class>
<properties>
<property name="openjpa.Log" value="DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
<property name="openjpa.jdbc.MappingDefaults" value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/>
</properties>
</persistence-unit>
</persistence>