2014-11-17 2 views
0

Я нашел очень странное поведение в нашем приложении grails сегодня, которое хочу поделиться с вами.Grails findById (null) возвращающий «случайный» результат

Мы используем grails 2.3.11 на mysql 5.1.48.

У нас был DomainObject.findById(id) в одном из ваших действий с контроллером. Нам не удалось проверить идентификатор для нулевого значения, поэтому DomainObject.findById(null) будет вызываться, если в качестве аргумента не передается id.

Обычно DomainObject.findById(null) возвратит null, но есть особое условие, которое даст другие результаты!

Если действия контроллера называется до этого вставили новую запись в базе данных (назовём это объект B), независимо от объекта домена хранится, то DomainObject.findById(null) найдет DomainObject с тем же идентификатором объекта B получил на вставить.

Итак, когда действие контроллера вызывается перед сохранением чего-либо, findById(null) вернет строку. И эта строка будет иметь тот же идентификатор, что и последний вставленный элемент.

Я полностью осознаю, что использование findById(null) - это не желаемый способ сделать это, но я был очень шокирован результатами, которые он дал. Но возвращение какого-либо кажущегося «случайного» результата кажется мне очень странным.

Я также хочу отметить, что DomainObject.get(null) не пострадает от этой проблемы.

Кто-нибудь еще был свидетелем этого?

Существует активная Джира, указывающая в этом направлении: https://jira.grails.org/browse/GRAILS-9628, но это не описывает эту проблему.

ответ

0

Мы действительно не поддерживаем передачу null в качестве аргумента для такого динамического искателя. Динамические поисковики имеют явную поддержку запросов с помощью null. Вместо DomainClass.findByName(null) вы бы назвали DomainClass.findByNameIsNull(). Если у вас есть ссылка, которая может быть или не быть нулевой, вместо того, чтобы передавать это как аргумент динамическому поисковому устройству, код почти всегда можно сделать более чистым, написав запрос критериев или запрос «где», в котором есть условное выражение ,

Я надеюсь, что это поможет.

+0

Когда я увидел этот вопрос и протестировал его в одном из моих приложений, запрос был «правильно» отправлен в базу данных как «id is null» - я согласен, что это лучше быть явным и проверять значение null в коде, но почему GORM иногда обрабатывает это, а иногда и нет? Это зависит от конкретного драйвера базы данных? Hibernate/GORM версия? –

+0

ty для наблюдения. Я знаю, что отчасти это я виноват, я был просто озадачен результатами. Я предполагаю, что не должно быть слишком сложно обрабатывать findByXXX (null) как findByXXXIsNull, потому что это то, что люди ожидают. У меня не было времени проверить его с помощью разных баз данных, но я могу подтвердить, что такой же ошибки не происходит, когда мы развертываем наше приложение на сервере с помощью maria-db. Возможно, это связано с окружающей средой разработки. – Oliver

+0

@Oliver У вас есть вопрос или «Кто-нибудь еще был свидетелем этого?» действительно ли это? –

0

Thx для вашей информации scot.

У меня есть более подробная информация. Это поведение также изменяется базой данных. Хотя mysql страдает от этого, maria-db (клон mysql) не делает!

Так что происходит, привязано к базовой системе баз данных. Это не должно происходить с абстракционным слоем ....

+0

Это должно быть редактирование вопроса. публикация ответа должна быть зарезервирована для предлагаемых решений. –