0

所以我使用带有 Hibernate 插件的 GigaSpaces XAP 将我的数据库表加载到他们的网格缓存中,不幸的是,对于查询网格,他们不支持直接不区分大小写的搜索。

他们提供了 2 个解决方案:
1- 使用慢的 LIKE 查询(与 SQL 相同)(甚至不会为此烦恼)
2- 为我希望不区分大小写的字段创建一个单独的属性。

所以现在我的选择是:
1- 在 DB 中创建一个额外的列以具有不区分大小写的字段(不在此生命周期内)
2- 为 XAP 创建一个自定义数据加载器插件,以便在加载数据的那一刻将字段存储在“ToLower”属性。(支持,但将作为最后的手段离开)

我绝对不会选择#1,我会将自定义数据加载器作为最后的结果。所以我的想法是...

class Person {
    String firstName
    String firstNameLower

    public void setFirstName(String firstName) {
        this.firstName = firstName

        this.firstNameLower = firstName.toLowerCase(...);
    }
}

这适用于 Hibernate 吗?由于 GigaSpace 数据加载器使用 Hibernate,而我的 pojo 几乎是一个实体类。我使用的是 Hibernate XML 映射而不是注释。“ToLower”字段将不会被映射。Hibernate 是在所有映射的字段上调用 ​​setXXX() 还是在底层做了一些花哨的代码替换并且不调用 setXXX() 方法。

我还认为注释在这里会很好用,但不确定如何实现它们,或者即使在这种情况下可能。

4

3 回答 3

1

hibernate 确实使用代理对象,但数据仍存储在您的对象中,并且 hibernate 将使用您提供的 getter/setter 实现,因此如果您想设置小写版本,您的解决方案应该可以工作,尽管我不清楚您为什么需要一个单独的实例变量来存储小写版本。

本文介绍了代理的基础知识。

于 2010-12-22T19:21:11.940 回答
1

对于任何有兴趣的人。

只需创建该字段的“tolower()”方法并在其上添加索引注释,您就可以将您的 pojo 映射到通常的休眠方式。

于 2011-01-18T17:12:38.603 回答
0

如果您将 Hibernate 配置为使用字段访问器方法(而不是直接访问字段),其默认行为是使用所有 setXXX() 方法。

我认为在您的情况下,最好的解决方案是(如果 Hibernate 仅用于 GigaSpace)通过使用标准 StringType 定义自定义类型来加载数据然后将其转换为小写来自定义 Hibernate 加载数据的方式......

同时,如果您的系统需要小写数据,您不能确保输入数据库的所有字符串都是小写的吗?

于 2010-12-22T19:17:59.663 回答