Domanda

Sto cercando di convertire un'interrogazione criteri di lavoro in una query di nome, e non ottenere la giusta sintassi. La versione HQL vuole a quanto pare sia il tipo e la params ID specificato.

La query è finita una classe mappata con qualsiasi (di seguito anche)

Qualcuno può darmi una mano ottenere la giusta sintassi?

Saluti,
Berryl

criteri LAVORO interrogazione

    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

ANY Mapping (che funziona!)

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

query denominata finora (non funzionante)

I pensare Questa è la sintassi HQL ma un messaggio di errore dice param manca

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

UPDATE

Questa combinazione esegue, ma dà la risposta sbagliata. non si può dire se è più vicino o più lontano da quello che ho bisogno ancora

          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>();
È stato utile?

Soluzione

Ok, per Fabio Maulo, dev vantaggio al NHib:

"Bisogna usare i valori dei meta-dati non il typeof (entità) .FullName"

Quindi, nel mio caso il seguente ha effettuato l'ultima HQL Ho dovuto lavorare:

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

Un brutto po 'di quanto avrei sperato, ma la prendo: -)

HTH,
Berryl

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top