我正在使用 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>();
我也试过“从项目 p where p.StartDate.Month = 12”但它没有用。
那么使用 HQL 或标准 API 是否有可能以与数据库无关的方式编写这样的查询?
最佳答案
如果您定期查询月、日、年,您实际上不应该将日期存储为 DateTime 列 - 这会使查询效率极低。您可以轻松地创建一个“月份”列并对其进行查询(您的 DBA 会再次爱上您)
关于c# - 在 HQL 查询的 "where"子句中使用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/317190/