предположите в объекте существует идентификатор атрибутов, имя пользователя, возраст, адрес. Теперь я просто хочу идентификатор и имя пользователя, и я использую этот код для него.
Проекции включают возврат чего-то другого, чем список объектов от запроса.
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();
Как я получу значения. В котором объект будет они оценить быть взятым.
«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; }
}