Пакетное обновление в NHibernate

Полное регулярное выражение:

-?(?:[_a-z]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*

Таким образом, все ваши перечисленные символы, кроме «-» и «_», не допускаются, если они используются напрямую. Но вы можете кодировать их, используя обратную косую черту foo\~bar или используя нотацию Unicode foo\7E bar.

23
задан Graviton 23 April 2009 в 09:42
поделиться

5 ответов

Я знаю, что опоздал на вечеринку по этому поводу, но подумал, что вам может быть интересно узнать, что теперь это возможно с использованием HQL в NHibernate 2.1+

session.CreateQuery(@"update Users set Country = 'Antarctica'")
.ExecuteUpdate();
41
ответ дан MPritchard 29 November 2019 в 00:46
поделиться

Начиная с NHibernate 5.0, можно выполнять массовые операции с использованием LINQ.

session.Query<Cat>()
.Where(c => c.BodyWeight > 20)
.Update(c => new { BodyWeight = c.BodyWeight / 2 });

NHibernate сгенерирует один SQL-запрос «update».

См. Обновление сущностей

.
6
ответ дан bN_ 29 November 2019 в 00:46
поделиться

Нет, это не очень хороший подход!

Собственный SQL во много раз лучше для такого рода обновлений.

UPDATE USERS SET COUNTRY = 'Antartica';

Просто не может быть проще, и ядро ​​базы данных будет обрабатывать это в сто раз эффективнее, чем строка Java-кода за один раз.

1
ответ дан duffymo 29 November 2019 в 00:46
поделиться

Вы можете установить размер пакета для обновлений в конфигурационном файле nhibernate.

<property name="hibernate.adonet.batch_size">16</property>

И вам не нужно вызывать там Session.Update (User) - просто очистите или зафиксируйте транзакцию, и NHibernate справится с вами.

EDIT: я собирался опубликовать ссылку на соответствующий раздел Документы nhibernate, но сайт не работает - вот старый пост Айенде на эту тему:

Относительно того, является ли использование NHibernate (или любого ORM) здесь хорошим подходом, это зависит от контекст. Если вы делаете одноразовое обновление каждой строки в большой таблице с одним значением (например, установка для всех пользователей страны ' Антарктида »(кстати, это континент, а не страна!), Тогда вам, вероятно, следует использовать SQL-оператор UPDATE. Если вы собираетесь обновлять несколько записей одновременно со страной как часть вашей бизнес-логики при общем использовании вашего приложения, то использование ORM может быть более разумным методом. Это зависит от количества строк, которые вы обновляете каждый раз.

Возможно, самый разумный вариант здесь, если вы не уверены, это настроить параметр batch_size в NHibernate и посмотреть, как это работает. Если производительность системы неприемлема, вы можете взглянуть на реализацию простого SQL-оператора UPDATE в своем коде.

Если вы собираетесь обновлять несколько записей одновременно со страной как часть вашей бизнес-логики при общем использовании вашего приложения, то использование ORM может быть более разумным методом. Это зависит от количества строк, которые вы обновляете каждый раз.

Возможно, самый разумный вариант здесь, если вы не уверены, это настроить параметр batch_size в NHibernate и посмотреть, как это работает. Если производительность системы неприемлема, вы можете взглянуть на реализацию простого SQL-оператора UPDATE в своем коде.

Если вы собираетесь обновлять несколько записей одновременно со страной как часть вашей бизнес-логики при общем использовании вашего приложения, то использование ORM может быть более разумным методом. Это зависит от количества строк, которые вы обновляете каждый раз.

Возможно, самый разумный вариант здесь, если вы не уверены, это настроить параметр batch_size в NHibernate и посмотреть, как это работает. Если производительность системы неприемлема, вы можете взглянуть на реализацию простого SQL-оператора UPDATE в своем коде.

9
ответ дан 29 November 2019 в 00:46
поделиться

Вам не нужно обновлять или очищать:

IList<User> users = session.CreateQuery (...).List<User>;
users.Foreach(u=>u.Country="Antartica")
session.Transaction.Commit();

Я думаю, что NHibernate пишет пакет для всех изменений.

Проблема в том, что ваши пользователи должны быть загружены в память. Если возникает проблема, вы все равно можете использовать собственный SQL с помощью NHibernate. Но пока вы не докажете, что это проблема с производительностью, оставайтесь с хорошим решением.

4
ответ дан 29 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

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