0

Spring 文档提供了一个示例,如何根据其中一个参数计算自定义键:

@Cacheable(value="book", key="isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

但是,如果我需要从多个参数计算密钥怎么办?例如在

@Cacheable(value="book", key="???")
public Book findBook(String author, String title,
                     boolean checkWarehouse, boolean includeUsed)

author我将如何从和计算密钥title到目前为止,我想出了丑陋的解决方案,例如

author.hashCode() + 31 * title.hashCode()

或者我可以创建一个外部辅助函数,例如

public static int hashes(Object... args) {
    return java.util.Arrays(args).asList().hashCode();
}

并称它为key="T(mypackage.MyHelperClass).hashes(author, title)". 仍然远非优雅。

(在我看来,如果@CacheableString[] key而不是会更容易String key。对于默认键,Spring 无论如何都必须将多个散列组合成一个。)

4

2 回答 2

1

如果您使用的是 JDK 1.7,您可能可以执行以下操作:

@Cacheable(value="book", key="T(java.util.Objects).hash(#p0,#p1)")
public Book findBook(String author, String title,
                     boolean checkWarehouse, boolean includeUsed)
于 2012-11-28T14:56:55.387 回答
0

密钥不是哈希!不要使用 Objects.hash 或类似内容创建密钥。在 javadoc 中查找。

对于您的情况,使用您的字段、多参数构造函数创建类 ComplexKey,并为此字段生成 hashCode 和 equals。

于 2016-04-01T18:49:36.350 回答