如何在HQL中使用DATEPART从DATETIME中获取YEAR

本文关键字:DATETIME 获取 YEAR DATEPART HQL | 更新日期: 2023-09-27 18:27:01

我是StackOverflow的新用户,需要HQL字符串的帮助。。

在SQL中,我的查询是这样的。。

SELECT DISTINCT DATEPART(yyyy, Moment) AS Year,
FROM PRODUCT_SOURCE

如何将其转换为HQL?

我试过了,但没用。。

query = "SELECT DISTINCT DATEPART(year, p.Moment) as Year, " + 
        "FROM Product_Source as p";

如何在HQL中使用DATEPART从DATETIME中获取YEAR

我是以SQL2008方言为基础的,所以请根据需要进行更改。

public class MsSql2008ExtendedDialect : MsSql2008Dialect
{
  public MsSql2008ExtendedDialect()
  {
    RegisterFunction("DATEPART_YEAR", 
      new SQLFunctionTemplate(NHibernateUtil.DateTime, "datepart(year, ?1)"));
  }
} 

要使用你会像这个一样使用你的HQL

query = "SELECT DISTINCT DATEPART_YEAR(p.Moment) as Year, " + 
        "FROM Product_Source as p";

编辑正如Diego非常正确地指出的那样,MSSQL服务器中的大多数函数都已经注册。有关完整列表,请参阅https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/MsSql2000Dialect.cs

所以只需使用:-

query = "SELECT DISTINCT year(p.Moment) as Year, " + 
        "FROM Product_Source as p";

year函数已经在内部映射,因此:

SELECT DISTINCT year(p.Moment) as Year,
FROM Product_Source as p

这是由MsSql2000Dialect(较新的MSSQL方言从中继承)注册的。

现在,假设Product_Source是类的名称,这很奇怪,因为它不遵循通常的.NET约定(应该去掉下划线)