1

次のようなNHibernate基準クエリがあります。

using (var unitOfWork = this.UnitOfWorkFactory.CreateUnitOfWork())
{
    const string fromstring = "2013-01-29 23:30:33.5993";
    var from = DateTime.Parse(fromstring);

    const string tostring = "2013-01-29 23:30:33.63434";
    var to = DateTime.Parse(tostring);

    var criteria = unitOfWork.Session.CreateCriteria<DataModel>();

    criteria.Add(Restrictions.Ge("Created", from));
    criteria.Add(Restrictions.Le("Created", to));

    items = criteria.List<DataModel>();
}

私はPostgresqlを使用しています。これがテーブルマッピングです:

-- Table: data

-- DROP TABLE data;

CREATE TABLE data
(
  id integer NOT NULL DEFAULT nextval('data__sequence'::regclass),
  created timestamp without time zone NOT NULL,
  CONSTRAINT itemsupdatelog_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE data
  OWNER TO ubuntu;

そしてNHibernateマッピング:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data.Models">
  <class name="DataModel" table="Data" mutable="false">
    <id name="Id">
      <generator class="sequence">
        <param name="sequence">Data__Sequence</param>
      </generator>
    </id>

    <property name="Created" not-null="true" type="Timestamp" />

  </class>
</hibernate-mapping>

テーブル内のデータが良好に見えることを確認できます(つまり、作成されたすべての値に間違いなくミリ秒があり、NHibernateを使用してデータベースの値OUTにクエリを実行すると、DateTimeオブジェクトのミリ秒が正しくなります)。

ただし、NHProfを使用してクエリを調べると、NHibernateはクエリで正しいミリ秒を送信していません。

    SELECT this_.Id            as Id1_0_,
       this_.Created       as Created1_0_,
FROM   Data this_
WHERE  this_.Created >= '2013-01-29T23:30:33.00' /* :p1 */
       and this_.Created <= '2013-01-29T23:30:33.00' /* :p2 */
ORDER  BY this_.Created desc

何か案は?

4

1 に答える 1

0

更新: 問題はNHProfにあるようです。NHProfによって報告されたSQL:

SELECT this_.Id      as Id0_0_,
   this_.Created as Created0_0_
FROM   data this_
WHERE  this_.Created >= '2013-01-29T23:30:33.00' /* :p0 */
       and this_.Created <= '2013-01-29T23:30:33.00' /* :p1 */

postgresログで報告されたSQL:

SELECT this_.Id as Id0_0_, this_.Created as Created0_0_ 
FROM data this_ 
WHERE this_.Created >= ((E'2013-01-29 23:30:33.599300')::timestamp) 
and this_.Created <= ((E'2013-01-29 23:30:33.634340')::timestamp)

再確認するために、クエリのミリ秒の間にある行を挿入しました。

insert into data (created) values ('2013-01-29 23:30:33.600')

そして、この行が返されます。

于 2013-01-30T18:21:15.913 に答える