16.9. 根据自然标识查询(Queries by natural identifier)

优质
小牛编辑
127浏览
2023-12-01

对 大多数查询,包括条件查询而言,因为查询缓存的失效(invalidation)发生得太频繁,查询缓存不是非常高效。然而,有一种特别的查询,可以通过 不变的自然键优化缓存的失效算法。在某些应用中,这种类型的查询比较常见。条件查询 API 对这种用例提供了特别规约。

首先,你应该对你的 entity 使用 <natural-id> 来映射自然键,然后打开第二级缓存。


<class name="User">
    <cache usage="read-write"/>
    <id name="id">
        <generator class="increment"/>
    </id>
    <natural-id>
        <property name="name"/>
        <property name="org"/>
    </natural-id>
    <property name="password"/>
</class
>

注意,此功能对具有mutable自然键的 entity 并不适用。

现在,我们可以用 Restrictions.naturalId() 来使用更加高效的缓存算法。

session.createCriteria(User.class)
    .add( Restrictions.naturalId()
        .set("name", "gavin")
        .set("org", "hb") 
    ).setCacheable(true)
    .uniqueResult();