NHibernate - самый легкий способ сделать ПОДОБНЫЙ поиск против целочисленного столбца с Критериями API?

Мое мнение - то, что SOA может быть полезным на макро-уровне, но каждый сервис, вероятно, все еще будет достаточно большим для необходимости в нескольких внутренних компонентах. Внутренние компоненты могут извлечь выгоду из архитектуры OO.

API SOA должен быть определен более тщательно, чем внутренние API, так как это - внешний API. Типы данных, переданные на этом уровне, должны быть максимально простыми без внутренней логики. Если существует некоторая логика, которая тяготеет к типу данных (например, проверка), должен предпочтительно быть один сервис, отвечающий за выполнение логики на типе данных.

10
задан Mikko Maunu 25 August 2013 в 17:35
поделиться

1 ответ

Если бы Number было строкой, это было бы просто:

.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))

Поскольку у вас есть число, NHibernate проверит тип Number и, если вы дадите ему строку, выдаст исключение .

Не уверен, почему команда NH не предоставила перегрузку с объектом в качестве параметра и параметрами MatchMode ....

Как бы то ни было, вы все еще можете сделать это так:

.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))

Изменить

О alias:

(я не могу найти, где в документации говорится об этом, но вот мое понимание этого)

{alias} возвращает псевдоним, используемый NH для самого последнего CreateCriteria. Итак, если бы у вас был:

session.CreateCriteria<User>("firstAlias")
       .CreateCriteria("firstAlias.Document", "doc")
       .Add(Expression.Sql("{alias}.Number like ?", "%2%",  
                           NHibernateUtil.String)).List<User>();

{alias} в этом случае был бы 'doc' - так что вы бы получили: doc.Number.

Итак, всегда используйте {alias} после CreateCriteria, псевдоним которого вам нужно использовать .

24
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: