1

我正在尝试通过 HQL 中的存储过程获取当前时间戳。这意味着我的代码如下所示:

var currentTimestamp =
    session.CreateQuery("SELECT CURRENT_TIMESTAMP()")
           .UniqueResult<DateTime>();

这行不通。具体来说,它System.NullReferenceException深入研究了 NHibernate HqlParser.cs 文件。我对此进行了一些尝试,并改为使用以下方法:

var currentTimestamp =
    session.CreateQuery("SELECT CURRENT_TIMESTAMP() FROM Contact")
           .SetMaxResults(1)
           .UniqueResult<DateTime>();

现在我有了我想要的数据,但我没有 HQL 查询。我希望查询代表我要问的问题——就像我的原始格式一样。

这里有一个明显的问题是“你为什么使用 HQL?” 我知道我可以很容易地做到这一点session.CreateSQLQuery(...),直接访问我们的 MySQL 5.1 数据库。这只是我的核心问题的一个示例,根本原因是我在整个代码库中使用自定义无参数 HQL 函数,并且我希望进行集成测试,以尽可能隔离地运行这些 HQL 无参数函数可能的。

我的 hack 还包含一些严肃的假设。它不会返回结果,例如,如果 Contact 表中没有记录,或者 Contact 表不再存在。

4

1 回答 1

1

在数据库表的上下文之外检索 CURRENT_TIMESTAMP()(或任何其他数据库函数)的方法因数据库而异 - 有些允许,有些不允许。例如,Oracle 不允许在没有表的情况下进行选择,因此它们提供了一个具有单行的系统表,称为 DUAL。

我怀疑 NHibernate 在 HQL 中主要实现了所有数据库实现中通用的功能,因此没有实现无表选择。

我可以建议三种方法:

  1. 创建一个隐藏无表选择的视图,例如“create view dtm as select current_timestamp() as datetime”

  2. 遵循 Oracle 方法并创建一个包含单行的实用程序表,您可以将其用作选择中的表

  3. 创建一个仅执行“select current_timestamp()”的简单存储过程

于 2012-09-19T13:37:48.263 回答