Yeah, HQL did the job for me. But the string nature of hql is giving me a little itch so i'm just trying to find a way doing it in hql. I dont use LINQ2Nh that much because at its current state it has a lot of limitations. Well thanks anyway. I'll probably stick to hql for the moment.
On Wed, Jun 16, 2010 at 11:52 PM, Diego Mijelshon <[email protected]>wrote: > I don't use Criteria a lot, so I'm not sure about that restriction. > Have you tried with Linq or HQL? It's probably easier. > > Diego > > > On Wed, Jun 16, 2010 at 10:57, Reggie Pangilinan < > [email protected]> wrote: > >> I assume your PatientName class has a calculated property, but NHibernate >>> does not know about it. >> >> >> Yes Fullname is a calculated property and NHibernate doesnt know about it. >> But Nhibernate knows about the component. I think Nhibernate cannot do >> projection from a component (a class with different properties), But correct >> me if i am wrong. My conclusion is just based on pure observations. i tried >> this query >> >> IList<PatientListViewModel> list = >> y.CreateCriteria<Patient>() >> >> >> .SetProjection(Projections.ProjectionList() >> >> .Add(Projections.Property("Birthdate"), "Birthdate") >> >> .Add(Projections.Property("Doctor.Id"), "DoctorId") >> >> .Add(Projections.Property("Gender"), "Gender") >> .Add(Projections.Property("Id"), >> "PatientId") >> .Add(Projections.Property("Name"), >> "Name") >> ) >> >> .SetResultTransformer(Transformers.AliasToBean<PatientListViewModel>()) >> .List<PatientListViewModel>(); >> >> and it returned an error message >> >> Message: property does not map to a single column: Name >> Source: NHibernate >> StackTrace: >> at >> NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumn(ICriteria >> criteria, String propertyName) >> at NHibernate.Criterion.PropertyProjection.ToSqlString(ICriteria >> criteria, Int32 loc, ICriteriaQuery criteriaQuery, IDictionary`2 >> enabledFilters) >> at NHibernate.Criterion.AliasedProjection.ToSqlString(ICriteria >> criteria, Int32 position, ICriteriaQuery criteriaQuery, IDictionary`2 >> enabledFilters) >> at NHibernate.Criterion.ProjectionList.ToSqlString(ICriteria criteria, >> Int32 loc, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) >> at >> NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetSelect(IDictionary`2 >> enabledFilters) >> at >> NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable >> persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor >> factory, ICriteria criteria, String rootEntityName, IDictionary`2 >> enabledFilters) >> at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable >> persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, >> String rootEntityName, IDictionary`2 enabledFilters) >> at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList >> results) >> at NHibernate.Impl.CriteriaImpl.List(IList results) >> at NHibernate.Impl.CriteriaImpl.List[T]() >> >> >> i guess you can only do projections on properties mapped to a column and >> not properties mapped on a component(a class with different properties). So >> to provide more details here are my classes >> >> public class PatientListViewModel >> { >> #region Properties >> public DateTime Birthdate { get; set; } >> public long DoctorId { get; set; } >> public PersonName Name { get; set; } >> public Gender Gender { get; set; } >> public long PatientId { get; set; } >> #endregion >> } >> >> >> public class PersonName >> { >> #region Fields >> private string _Firstname; >> private string _Lastname; >> private string _Middlename; >> #endregion >> >> #region Properties >> >> /// <summary> >> /// Gets or sets the firstname. >> /// </summary> >> /// <value>The firstname.</value> >> public string Firstname >> { >> get { return _Firstname; } >> set >> { >> _Firstname = value; >> } >> } >> >> /// <summary> >> /// Gets the fullname1. >> /// </summary> >> /// <value>The fullname1.</value> >> public string Fullname1 { get { return _Lastname + ", " + >> _Firstname + " " + _Middlename; } } >> >> /// <summary> >> /// Gets the fullname2. >> /// </summary> >> /// <value>The fullname2.</value> >> // public string Fullname2 { get { return _Lastname + ", " + >> _Firstname + " " + (_Middlename.Trim().Length > 0 ? _Middlename.Substring(0, >> 1) + "." : string.Empty); } } >> >> /// <summary> >> /// Gets the fullname. >> /// </summary> >> /// <value>The fullname.</value> >> public string Fullname { get { return _Firstname + " " + >> _Middlename + " " + _Lastname; } } >> >> /// <summary> >> /// Gets or sets the lastname. >> /// </summary> >> /// <value>The lastname.</value> >> public string Lastname >> { >> get { return _Lastname; } >> set >> { >> _Lastname = value; >> } >> } >> >> /// <summary> >> /// Gets or sets the middlename. >> /// </summary> >> /// <value>The middlename.</value> >> public string Middlename >> { >> get { return _Middlename; } >> set >> { >> _Middlename = value; >> } >> } >> #endregion >> } >> >> >> >> On Tue, Jun 15, 2010 at 11:05 PM, Diego Mijelshon <[email protected] >> > wrote: >> >>> Sorry, I wasn't looking clearly. >>> There is NO FullName property in your mapping. >>> I assume your PatientName class has a calculated property, but NHibernate >>> does not know about it. >>> It's probably better to add a Name property to PatientListViewModel and >>> project or set Fullname from it (if you want to use the transformer, that >>> is) >>> >>> Diego >>> >>> >>> On Tue, Jun 15, 2010 at 11:40, Reggie Pangilinan < >>> [email protected]> wrote: >>> >>>> Yeah i did that already here is my query >>>> >>>> IList<PatientListViewModel> list = >>>> >>>> _patientDao.ContextSession.CreateCriteria<Patient>() >>>> >>>> .SetProjection(Projections.ProjectionList() >>>> >>>> .Add(Projections.Property("Birthdate"), >>>> "Birthdate") >>>> >>>> .Add(Projections.Property("Doctor.Id"), >>>> "DoctorId") >>>> >>>> .Add(Projections.Property("Gender"), >>>> "Gender") >>>> >>>> .Add(Projections.Property("Id"), >>>> "PatientId") >>>> >>>> .Add(Projections.Property("Name.Fullname"), >>>> "Fullname") >>>> ) >>>> >>>> .SetResultTransformer(Transformers.AliasToBean<PatientListViewModel>()) >>>> .List<PatientListViewModel>(); >>>> >>>> >>>> but its throwing an exception the message is "could not resolve >>>> property: Name.Fullname of: OneCare.Domain.Entities.Patient" >>>> >>>> >>>> >>>> On Tue, Jun 15, 2010 at 10:25 PM, Diego Mijelshon < >>>> [email protected]> wrote: >>>> >>>>> Use Name.FullName instead of Patient.Name.FullName. >>>>> Patient does not have a Patient property. >>>>> >>>>> Diego >>>>> >>>>> >>>>> On Tue, Jun 15, 2010 at 11:22, Reggie Pangilinan < >>>>> [email protected]> wrote: >>>>> >>>>>> This is my full mapping file for Patient Entity >>>>>> >>>>>> >>>>>> <?xml version="1.0" encoding="utf-8" ?> >>>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >>>>>> assembly="OneCare.Domain" >>>>>> namespace="OneCare.Domain.Entities"> >>>>>> <class name="Patient"> >>>>>> <id name="Id" type="Int64"> >>>>>> <generator class="hilo"/> >>>>>> </id> >>>>>> <version name="RecordVersion" column="RecordVersion" >>>>>> type="int"/> >>>>>> <component name="Name" >>>>>> class="OneCare.Domain.Entities.PersonName,OneCare.Domain" > >>>>>> <property name="Firstname" not-null="true"/> >>>>>> <property name="Lastname" not-null ="true"/> >>>>>> <property name="Middlename"/> >>>>>> </component> >>>>>> <property name ="Gender" type >>>>>> ="OneCare.Domain.Entities.Gender,OneCare.Domain" /> >>>>>> <property name ="Birthdate" type ="System.DateTime" >>>>>> not-null="true"/> >>>>>> <many-to-one name="Doctor" column="DoctorId" /> >>>>>> </class> >>>>>> </hibernate-mapping> >>>>>> >>>>>> >>>>>> i achieved what i want using this HQL query >>>>>> >>>>>> IList<PatientListViewModel> list = >>>>>> >>>>>> _patientDao.ContextSession.CreateQuery(@" >>>>>> select >>>>>> >>>>>> f.Birthdate as Birthdate, >>>>>> >>>>>> f.Doctor.Id as DoctorId, >>>>>> >>>>>> f.Gender as Gender, >>>>>> >>>>>> f.Id as PatientId, >>>>>> >>>>>> f.Name as Name >>>>>> >>>>>> from Patient f >>>>>> where >>>>>> f.Doctor.Id = :userid >>>>>> ") >>>>>> >>>>>> .SetInt64(@"userid",WebUserHelper.CurrentUserId) >>>>>> >>>>>> .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<PatientListViewModel>()) >>>>>> .List<PatientListViewModel>(); >>>>>> >>>>>> Now i want to know if i can do this using the CRITERIA API, i heard >>>>>> that there are limitations using the criteria api. so is it possible to >>>>>> achive this kind of result? Thanks in advance. >>>>>> >>>>>> >>>>>> >>>>>> On Mon, Jun 14, 2010 at 10:34 PM, Jason Dentler < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> What is your mapping for Patient and Name ? >>>>>>> >>>>>>> Thanks, >>>>>>> Jason >>>>>>> >>>>>>> >>>>>>> On Mon, Jun 14, 2010 at 12:04 AM, reggieboy < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Hello guys im trying to hydrate a DTO using projections in >>>>>>>> NHibernate >>>>>>>> this is my code >>>>>>>> >>>>>>>> >>>>>>>> IList<PatientListViewModel> list = >>>>>>>> >>>>>>>> y.CreateCriteria<Patient>() >>>>>>>> >>>>>>>> .SetProjection(Projections.ProjectionList() >>>>>>>> >>>>>>>> .Add(Projections.Property("Birthdate"), >>>>>>>> "Birthdate") >>>>>>>> >>>>>>>> .Add(Projections.Property("Doctor.Id"), >>>>>>>> "DoctorId") >>>>>>>> >>>>>>>> .Add(Projections.Property("Gender"), >>>>>>>> "Gender") >>>>>>>> >>>>>>>> .Add(Projections.Property("Id"), >>>>>>>> "PatientId") >>>>>>>> >>>>>>>> .Add(Projections.Property("Patient.Name.Fullname"), >>>>>>>> "Fullname") >>>>>>>> ) >>>>>>>> >>>>>>>> .SetResultTransformer(Transformers.AliasToBean<PatientListViewModel>()) >>>>>>>> .List<PatientListViewModel>(); >>>>>>>> >>>>>>>> >>>>>>>> But this is throwing and exception, what do you think seems to be >>>>>>>> the >>>>>>>> problem? is this a limitation of the CRITERIA API? >>>>>>>> >>>>>>>> here is the error message >>>>>>>> >>>>>>>> Message: could not resolve property: Patient.Name.Fullname of: >>>>>>>> OneCare.Domain.Entities.Patient >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "nhusers" group. >>>>>>>> To post to this group, send email to [email protected]. >>>>>>>> To unsubscribe from this group, send email to >>>>>>>> [email protected]<nhusers%[email protected]> >>>>>>>> . >>>>>>>> For more options, visit this group at >>>>>>>> http://groups.google.com/group/nhusers?hl=en. >>>>>>>> >>>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "nhusers" group. >>>>>>> To post to this group, send email to [email protected]. >>>>>>> To unsubscribe from this group, send email to >>>>>>> [email protected]<nhusers%[email protected]> >>>>>>> . >>>>>>> For more options, visit this group at >>>>>>> http://groups.google.com/group/nhusers?hl=en. >>>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "nhusers" group. >>>>>> To post to this group, send email to [email protected]. >>>>>> To unsubscribe from this group, send email to >>>>>> [email protected]<nhusers%[email protected]> >>>>>> . >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/nhusers?hl=en. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "nhusers" group. >>>>> To post to this group, send email to [email protected]. >>>>> To unsubscribe from this group, send email to >>>>> [email protected]<nhusers%[email protected]> >>>>> . >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/nhusers?hl=en. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "nhusers" group. >>>> To post to this group, send email to [email protected]. >>>> To unsubscribe from this group, send email to >>>> [email protected]<nhusers%[email protected]> >>>> . >>>> For more options, visit this group at >>>> http://groups.google.com/group/nhusers?hl=en. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "nhusers" group. >>> To post to this group, send email to [email protected]. >>> To unsubscribe from this group, send email to >>> [email protected]<nhusers%[email protected]> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/nhusers?hl=en. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "nhusers" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]<nhusers%[email protected]> >> . >> For more options, visit this group at >> http://groups.google.com/group/nhusers?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
