Как создать регистронезависимое поле на Java POJO. Ищете хороший дизайн.
Поэтому я использую GigaSpaces XAP с плагином Hibernate для загрузки моей таблицы БД в их кеш сетки, к сожалению, для запросов к сетке они не поддерживают прямой поиск без учета регистра.
Они предложили 2 решения:
1. Используйте LIKE-запрос (такой же, как SQL), который медленный (даже не беспокоится об этом)
2- Создайте отдельное свойство полей, которые я хочу, чтобы регистр не учитывался.
Итак, теперь мой выбор:
1- Создайте дополнительный столбец в БД, чтобы иметь поле без учета регистра (не в этом времени жизни)
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 в значительной степени является классом Entity. Я использую отображение Hibernate XML, а не аннотации. Поля "ToLower" не будут отображены. Вызывает ли Hibernate setXXX() для всех отображаемых полей или выполняет некоторую причудливую замену кода под капотом и не вызывает методы setXXX().
Я также думаю, что аннотации было бы хорошо использовать здесь, но я не уверен, как их реализовать или даже если это возможно для этого случая.
3 ответа
Для всех, кто заинтересован.
Просто создайте метод "tolower()" для поля и добавьте к нему аннотацию индекса, и вы сможете отобразить свое pojo в спящий режим обычным способом.
hibernate использует прокси-объекты, но данные по-прежнему хранятся в вашем объекте, и hibernate будет использовать предоставляемые реализации getter / setter, поэтому ваше решение должно работать, если вы хотите установить строчную версию, хотя я не понимаю, зачем вам это нужно отдельная переменная экземпляра для хранения строчной версии.
В этой статье рассматриваются основы прокси.
Если вы сконфигурируете Hibernate для использования метода доступа к полям (а не для прямого доступа к полям), его поведением по умолчанию будет использование всего метода setXXX().
Я думаю, что в вашем случае лучшим решением было бы (если Hibernate используется только для GigaSpace), чтобы настроить способ загрузки данных Hibernate, определив пользовательский тип, используя standrd StringType для загрузки данных, а затем преобразовав его в нижний регистр...
Между тем, если вашей системе требуются данные в нижнем регистре, не можете ли вы убедиться, что все строки, введенные в базу данных, являются строчными?