Frage

Ich versuche, eine Abfrage für Arbeitskriterien in eine benannte Abfrage umzuwandeln und die Syntax nicht richtig zu machen. Die HQL -Version möchte anscheinend sowohl die angegebenen Typ- als auch die ID -Parameter.

Die Abfrage ist über eine Klassen, die mit jedem (unten auch) zugeordnet ist

Kann mir jemand eine Hand geben, die die Syntax richtig macht?

Prost,
Berryl

Arbeitskriterien Abfrage

    result = _session
        .CreateCriteria<Allocation>()
        .Add(Restrictions.Eq(propName_Resource, resource))
        .Add(Restrictions.Between(propName_StartTime, (DateTime)searchRange.Start, (DateTime)searchRange.End))
        .AddOrder(Order.Asc(propName_StartTime))
        .List<Allocation>();

                produces
SELECT this_.AllocationId as Allocati1_2_0_, this_.ResourceType as Resource2_2_0_, this_.ResourceId as ResourceId2_0_, this_.ActivityType as Activity4_2_0_, 
        this_.ActivityId as ActivityId2_0_, this_.StartTime as StartTime2_0_, this_.EndTime as EndTime2_0_, this_.PostingTime as PostingT8_2_0_ 
FROM Allocations this_ 
WHERE this_.ResourceType = @p0 and this_.ResourceId = @p1 and this_.StartTime between @p2 and @p3 ORDER BY this_.StartTime asc;@p0 = 'EMPLOYEE' [Type: String (0)], @p1 = 98304 [Type: Int32 (0)], @p2 = 3/14/2011 12:00:00 AM [Type: DateTime (0)], @p3 = 3/20/2011 11:59:59 PM [Type: DateTime (0)] 2011-03-14 Mon - 2011-03-20 Sun

Die alle Mapping (was funktioniert!)

<any name="Resource" cascade="all" id-type="System.Int32" meta-type="System.String"
     >
  <meta-value value="EMPLOYEE" class="Employee, ..." />
  <meta-value value="Facility" class="Facility, ..." />

  <column name="ResourceType"/>
  <column name="ResourceId"/>
</any>

So genannte Abfrage bisher (nicht funktioniert)

ich denken Dies ist die HQL -Syntax, aber die Fehlermeldung besagt, dass ein Param fehlt

....
          select a 
          from Allocation a 
          where a.Resource = :resource 
            and a.TimeRange.StartTime between :periodStart and :periodEnd
          order by a.TimeRange.StartTime
....

        return _session.GetNamedQuery("FetchByResourceForDateRange")
            .SetEntity("resource", resource)
            .SetDateTime("periodStart", searchRange.Start)
            .SetDateTime("periodEnd", searchRange.End)
            .List<Allocation>();

NHibernate.Exceptions.GenericADOException : could not execute query
[ select allocation0_.AllocationId as Allocati1_2_, allocation0_.ResourceType as   Resource2_2_, allocation0_.ResourceId as ResourceId2_, allocation0_.ActivityType as Activity4_2_, allocation0_.ActivityId as ActivityId2_, allocation0_.StartTime as StartTime2_, allocation0_.EndTime as EndTime2_, allocation0_.PostingTime as PostingT8_2_ from Allocations allocation0_ where allocation0_.ResourceType=@p0 and allocation0_.ResourceId=@p1 and (allocation0_.StartTime between @p2 and @p3) order by allocation0_.StartTime ]
  Name:resource - Value:George Washington 000001  Name:periodStart - Value:3/14/2011 12:00:00 AM  Name:periodEnd - Value:3/20/2011 11:59:59 PM
[SQL: select ... 
    from Allocations allocation0_ 
where allocation0_.ResourceType=@p0 and allocation0_.ResourceId=@p1 and (allocation0_.StartTime between @p2 and @p3) 
order by allocation0_.StartTime]

 ----> System.Data.SQLite.SQLiteException : SQLite error
Insufficient parameters supplied to the command

AKTUALISIEREN

Diese Kombination führt aus, gibt aber die falsche Antwort. Ich kann nicht sagen, ob es näher oder weiter von dem ist, was ich noch brauche

          select a 
          from Allocation a 
          where a.Resource.class = :class and a.Resource.id = :id 
            and a.TimeRange.StartTime between :periodStart and :periodEnd
          order by a.TimeRange.StartTime

        return _session.GetNamedQuery("FetchByResourceForDateRange")
            .SetString("class", typeof(Resource).FullName)
            .SetInt32("id", resource.Id)
            .SetDateTime("periodStart", searchRange.Start)
            .SetDateTime("periodEnd", searchRange.End)
            .List<Allocation>();
War es hilfreich?

Lösung

Ok, pro Fabio Maulo, Lead Dev auf NHIB:

"Sie müssen Ihre Meta-Daten-Werte verwenden, nicht die Typeof (Entity).

In meinem Fall machte ich also die letzte HQL, die ich Arbeit hatte:

return _session.GetNamedQuery("FetchByResourceForDateRange")
        .SetString("class", "EMPLOYEE")
        .SetInt32("id", resource.Id)
        .SetDateTime("periodStart", searchRange.Start)
        .SetDateTime("periodEnd", searchRange.End)
        .List<Allocation>();

Ein bisschen hässlicher als ich gehofft hätte, aber ich werde es nehmen:-)

HTH,
Berryl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top