Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. select * from foo where upper(bar) = upper(?);
при установке параметра на верхний регистр в вызывающей стороне можно избежать второго вызова функции.
В пост-ГРЭС можно сделать это:
SELECT whatever FROM mytable WHERE something ILIKE 'match this';
я не уверен, существует ли эквивалент для MySQL, но можно всегда делать это, которое немного ужасно, но должно работать и в MySQL и в пост-ГРЭС:
SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');
Преобразование в верхний является лучшим, поскольку оно покрывает совместимый синтаксис для 3 наиболее используемых бэкендов базы данных Rails. PostgreSQL, MySQL и SQLite вся поддержка этот синтаксис. Это имеет (незначительный) недостаток, что у Вас есть к верхнему регистру своя строка поиска в Вашем приложении или в Вашей строке условий, делая это немного более ужасным, но я думаю совместимость, которую Вы получаете, делает это worthwile.
И MySQL и SQLite3 имеют нечувствительный к регистру оператор LIKE. Только PostgreSQL имеет чувствительный к регистру оператор LIKE и PostgreSQL-определенное (на руководство) оператор ILIKE для поисков без учета регистра. Вы могли бы определить ILIKE insead ПОДОБНЫХ в Ваших условиях на приложении направляющих, но знать, что приложение прекратит работать под MySQL или SQLite.
опция трети А могла бы состоять в том, чтобы проверить, какой механизм базы данных Вы используете и изменяете строку поиска соответственно. Это могло бы быть лучше сделано путем взламывания / monkeypatching адаптеры соединения ActiveRecord и иметь адаптер PostgreSQL, изменяют строку запроса для замены "КАК" "ILIKE" до выполнения запросов. Это решение является однако самым замысловатым и в свете более легких путей как uppercasing оба условия, я думаю, что это не worh усилие (хотя Вы получили бы много одобрения для того, чтобы сделать его этот путь).
Мораль этой истории такова: не используйте другой программный стек для разработки и производства. Никогда.
Вы просто получите ошибки, которые не сможете воспроизвести в dev; ваше тестирование будет бесполезным. Только не делайте этого.
Об использовании другого механизма базы данных не может быть и речи - будет намного больше случаев, когда он будет вести себя иначе, чем просто LIKE (а также, проверяли ли вы сопоставления, используемые базами данных? идентичны во ВСЕМ СЛУЧАЕ? Если нет, то можете забыть ORDER BY для столбцов varchar, работающих одинаково)
Вы также можете попробовать плагин searchlogic , который выполняет за вас переключатель LIKE / ILIKE .
Если вы используете PostgreSQL 8.4, вы можете использовать citext модуль для создания текстовых полей без учета регистра.