>
> 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].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to