在HQL查询的“where”子句中使用日期

时间:2008-11-25 12:34:30

标签: c# nhibernate

我正在使用SQLite数据库并拥有以下持久化类(简化):

public class Project
{
    public virtual int Id { get; set; }
    public virtual DateTime StartDate { get; set; }
}

映射到数据库中的此表:

CREATE TABLE projects (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    start_date DATETIME
)

现在我需要编写一个查询,它将选择在给定月份内已启动的所有项目。

在SQL中我可以使用:

SELECT id FROM projects WHERE strftime('%m', start_date) = '12'

我不喜欢这个查询,它使用数据库特定功能“strftime”。

因此,以下HQL依赖于底层数据库:

// Get all projects that started in December (no matter which year)
var projects = session
    .CreateQuery(
        "from Project p " +
        "where strftime('%m', p.StartDate) = :month")
    .SetParameter("month", "12")
    .List<Project>();

我也试过“从Project p,其中p.StartDate.Month = 12”,但它没有用。

因此,使用HQL或标准API是否可以以数据库无关的方式编写此类查询?

3 个答案:

答案 0 :(得分:4)

如果您经常查询数月,日,年,那么您不应该将日期存储为DateTime列 - 这会使查询效率极低。您可以轻松创建“月”列并对其进行查询(并且您的DBA会再次爱你)

答案 1 :(得分:1)

我强烈建议您编写自定义函数。

http://ayende.com/Blog/archive/2006/10/01/UsingSQLFunctionsInNHibernate.aspx

我不是指sql函数,我的意思是用RegisterFunction注册的NHibernate函数来增强NHibernate方言。

另一个可能更好的例子: http://ayende.com/Blog/archive/2007/04/27/Paged-data--Count-with-NHibernate-The-really-easy-way.aspx

答案 2 :(得分:-1)

来自Project p,其中p.StartDate.ToString(“M”);