>
> 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.