NHibernate criteria query help

Given the following tables, I am trying to return all distributions for this Resource that fall between a given date range using a query of criteria:

create table Resources ( ResourceId integer, ResourceName TEXT not null, BusinessId TEXT not null, OrganizationName TEXT not null, primary key (ResourceId) ) create table Allocations ( AllocationId integer, StartTime DATETIME not null, EndTime DATETIME not null, PostingTime DATETIME, ResourceId INTEGER, ActivityBaseId INTEGER, primary key (AllocationId), unique (StartTime, EndTime, ResourceId, ActivityBaseId) ) public Resource FetchFor(Resource resource, DateRange range) { var allocations = _session.CreateCriteria<Resource>() .CreateCriteria("Allocations") .Add(Restrictions.Between("EndTime", (DateTime)range.Start, (DateTime)range.End)) .List<Allocation>(); if (allocations.Count() > 0) resource.ReplaceAllocations(allocations); return resource; } 

I get this exception when I run this:

 failed: NHibernate.QueryException : could not resolve property: EndTime of: Domain.Model.Allocations.Allocation 

The model is mapped, and I can easily save the resource and its associated distributions, as I do to test this Fetch request. Example NHib sql: NHibernate: INSERT INTO Allocations (StartTime, EndTime, PostingTime, ResourceId, ActivityBaseId) VALUES (@ p0, @ p1, @ p2, @ p3, @ p4); select last_insert_rowid (); @ p0 = 1/28/2010 12:00:00 AM, @ p1 = 1/28/2010 1:00:00 AM, @ p2 = NULL, @ p3 = 1, @ p4 = 4

The error message is misleading since NHIB clearly understands how to map Allocation.EndTime. You are welcome:
1) help solve the problem / clear the request in this post, and
2) list any favorite resources for studying nhib requests, especially if there are examples.

As I understand it, I do not understand that I am not using the Resource parameter in the example shown, since I have applied quite a lot (incorrectly?) Of the code from the example on Ayende placement . If I can get this connection request, I will turn it into a subquery for performance.

Thanks!
Berryl

=== NHib mapping =====

 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> <class xmlns="urn:nhibernate-mapping-2.2" name="Domain.Model.Allocations.Allocation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Allocations"> <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> <column name="AllocationId" /> <generator class="identity" /> </id> <property name="TimeRange" type="Data.UserTypes.AllocationTimeRangeUserType, Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> <column name="StartTime" not-null="true" unique-key="DomainSignature" /> <column name="EndTime" not-null="true" unique-key="DomainSignature" /> </property> <property name="PostingTime" type="System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="PostingTime" not-null="false" /> </property> <many-to-one class="Domain.Model.Resources.Resource, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="Resource_FK" name="Resource"> <column name="ResourceId" unique-key="DomainSignature" /> </many-to-one> <many-to-one class="Domain.Model.Activities.ActivityBase, Smack.ConstructionAdmin.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="ActivityBase_FK" name="Activity"> <column name="ActivityBaseId" unique-key="DomainSignature" /> </many-to-one> 

0
nhibernate criteria
source share
2 answers

It looks like you don't have a mapped Allocation property called EndTime, so it is not surprising that you are getting this error. The EndTime column is displayed through the custom TimeRange type, so you can request this.

The Allocation.cs sample and TimeRange client are also likely to help understand the problem.

+1
source share

I am trying to duplicate your problem, but have not been successful. Since you are not using the resource in your request, can you try to simplify things like:

 var allocations = _session.CreateCriteria<Allocation>() .Add(Restrictions.Between("EndTime", (DateTime)range.Start, (DateTime)range.End)) .List<Allocation>(); 

I made several join requests, I can give the following example: hope this helps:

  public IList<ItemOrder> GetItemOrderByCriteria(int? itemNumber, int? warehouseNumber, DateTime? orderPickDate, string orderStoreNum, string statusCode) { try { NHibernate.ICriteria criteria = NHibernateSession.CreateCriteria(typeof(Core.SuggestedOrders.ItemOrder)); if (itemNumber.HasValue) criteria.CreateCriteria("Item", "Item").Add(Expression.Eq("Item.ItemNumber", itemNumber.Value)); if (warehouseNumber.HasValue) criteria.CreateCriteria("Warehouse", "Warehouse").Add(Expression.Eq("Warehouse.WarehouseNumber", warehouseNumber)); if (!String.IsNullOrEmpty(orderStoreNum)) criteria.Add(Expression.Eq("OrdStoreNum", orderStoreNum)); if (!String.IsNullOrEmpty(statusCode)) criteria.Add(Expression.Eq("StatusCode", statusCode)); if (orderPickDate.HasValue) { DateTime minPickDate = new DateTime(orderPickDate.Value.Year, orderPickDate.Value.Month, orderPickDate.Value.Day, 0,0,0); DateTime maxPickDate = new DateTime(orderPickDate.Value.Year, orderPickDate.Value.Month, orderPickDate.Value.Day, 23,59,59); criteria.Add(Expression.Between("OrdPickDate", minPickDate, maxPickDate)); } return criteria.List<Core.SuggestedOrders.ItemOrder>(); } catch (NHibernate.HibernateException he) { DataAccessException dae = new DataAccessException("NHibernate Exception", he); throw dae; } } 
+1
source share

Source: https://habr.com/ru/post/649872/


All Articles