Проекции в NHibernate

предположите в объекте существует идентификатор атрибутов, имя пользователя, возраст, адрес. Теперь я просто хочу идентификатор и имя пользователя, и я использую этот код для него.

Проекции включают возврат чего-то другого, чем список объектов от запроса.

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();

Как я получу значения. В котором объект будет они оценить быть взятым.

6
задан Kent Boogaart 5 February 2010 в 16:35
поделиться

1 ответ

«Lisp - программируемый язык программирования»
. - Джон Фодераро, CACM, сентябрь 1991

Вот мой взгляд:

На поверхности Лисп - хороший, простой функциональный язык программирования. Там почти нет синтаксиса, и все части вписываются в логические пути.

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

Как только вы полностью впитали это, кажется, что другие языки установлены в камне, когда они позволяют вам говорить только несколько вещей. Лисп может построить любую абстракцию, если для нее можно определить синтаксис и семантику.

-121--763693-

При текущем управлении сущностью (подключенной к сеансу) все ее обновления напрямую отражаются на базовом месте хранения даже без вызова persist () .

В вашем случае вы загружаете свою сущность, поэтому она находится в сеансе. Тогда, даже если вы не вызываете contist () , он будет обновлен в базе данных при фиксации транзакции.

Описание persist () из javadoc:

Сделайте экземпляр сущности управляемым и постоянным.

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

P.S. Где я говорю «сеанс», поймите «менеджер объекта»

-121--4817660-

Если не используется результирующий трансформатор, проекция приведет к списку анонимных объектов с спроецированными значениями. Этого было бы достаточно для привязки данных.

Для других применений необходимо задать трансформатор результата, который создаст объекты известного типа. AliasToBeanTransformer создает объект указанного типа для каждой строки и устанавливает для его свойств значения строки.

Если известен тип результатов, можно использовать универсальный метод List < T > () .

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

Преобразователи результатов также могут использоваться в запросах SQL и HQL.

list2 = Session.CreateSQLQuery("select Id, Username from user_table")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

list2 = Session.CreateQuery("select Id, Username from User")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

В этих примерах класс Result не должен быть сопоставленным классом и должен иметь выбранные свойства.

partial class Result
{
    public int Id { get; set; }
    public string Username { get; set; }
}
27
ответ дан 8 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

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