我正在使用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是否可以以数据库无关的方式编写此类查询?
答案 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”);