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

Reply via email to