标准包含日期时,Hibernate查询缓存不起作用

法布里佐·斯特拉托(Fabrizio Stellato)

我有以下查询:

public List<SomeEntity> findArticlesById(String id) {
    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<SomeEntity> criteriaQuery = criteriaBuilder.createQuery(SomeEntity.class);
    final Root<SomeEntity> root = criteriaQuery.from(SomeEntity.class);
    final Join<SomeEntity, SomeOtherEntity> join = root.join(SomeEntity.property);

    criteriaQuery
            .select(root)
            .where(
                    criteriaBuilder.equal(join.get(SomeEntity_.id), id),
                    criteriaBuilder.between(criteriaBuilder.literal(new Date()), join.get(SomeEntity_.startDate), join.get(SomeEntity_.endDate))
            );

    return entityManager.createQuery(criteriaQuery)
            .setHint(QueryHints.HINT_CACHEABLE, true)
            .setHint(QueryHints.HINT_CACHE_REGION, CacheRegions.QUERY_ENTITY)
            .getResultList();
}

我希望在调用两次时命中查询缓存,但是它不起作用。

但是,如果我删除第二个谓词

criteriaBuilder.between(criteriaBuilder.literal(new Date()), join.get(SomeEntity_.startDate), join.get(SomeEntity_.endDate)

缓存可以正常工作。

原因是什么?

编辑

类定义:

@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Entity
@Table(name = "SOME_ENTITY")
public class SomeEntity implements Serializable {

    @EmbeddedId
    private SomeEntityPk pk;

    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ID", referencedColumnName="ID", insertable = false, updatable = false)
    private SomeOtherEntity someOtherEntity;

    ...

@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Entity
@Table(name = "SOME_ENTITY")
public class SomeEntity implements Serializable {

    @EmbeddedId
    private SomeEntityPk pk;

    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ID", referencedColumnName="ID", insertable = false, updatable = false)
    private SomeOtherEntity someOtherEntity;

    ...

@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Entity
@Table(name="SOME_OTHER_ENTITY")
public class SomeOtherEntity implements Serializable {

    @Id
    @Column(name="ID")
    private String id;

    @Column(name="DATE_START")
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDate;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="DATE_END")
    private Date endDate;
    
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
    @OneToMany(fetch=FetchType.LAZY, mappedBy=SomeEntity_.SOMEOTHERENTITY)
    private List<SomeEntity> someEntities;
    
    ...

我正在使用Hibernate 5.3.12.Final

卡维萨卡兰(Kavithakaran)
  • 我不认为您在重用已缓存的查询,因为您new Date()在条件构建器中使用了,因此parameter每次绑定到查询的结果都不同。
   criteriaBuilder.between(criteriaBuilder.literal(new Date())...
  • 出于测试目的,将findArticlesById方法修改findArticlesById(String id, Date date)并将其传递date给两个调用,请参见

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章