【问题标题】:Mix in some SQL in a HQL query在 HQL 查询中混入一些 SQL
【发布时间】:2014-11-27 16:54:39
【问题描述】:

我正在从数据库中读取元数据并基于它构建查询。

出于性能原因,我们的 DBA 创建了一个函数来选择某条数据。它看起来像这样:

SELECT tab.id, packName.fnName(p1 => tab.id, p2 => 5), packName.fnName(p1 => tab.id, p2 => 7)
FROM table tab

(表在NHibernate中映射)

是否可以将这种选择添加到 HQL 查询中?我使用的是Transformers.AliasToBean,所以 fnName() 的结果去哪里不是问题。

【问题讨论】:

  • 有可能——但=> 语法是Oracle 特有的吗?那里发生了什么?
  • p1 => tab.id 是命名参数。我很确定它是可选的。如果该解决方案仅适用于 Oracle,这不是问题,它们永远不会移动到另一个数据库(或者需要先重写大量其他代码)

标签: sql oracle nhibernate hql


【解决方案1】:

您应该能够通过创建自定义方言并使用该方言注册您的函数来完成此操作:

public class MyCustomDialect : Oracle10gDialect // or whatever version you're using
{
    public MyCustomDialect()
    {
        RegisterFunction(
            "packname",
            new SQLFunctionTemplate(
                NHibernateUtil.String, "packName.fnName(p1 => ?1, p2 => ?2)"));
    }
}

然后您必须配置 NHibernate 以使用您的自定义方言(您已经在某个地方这样做了,也可以通过 hibernate.cfg.xml 文件中的 XML 或在配置代码中)。只需将此自定义方言替换为当前方言即可。

现在你应该可以在 HQL 中调用你的函数了:

session.CreateQuery(
        "select tab.id, packname(tab.id, 5), packname(tab.id, 7) from table tab")
    .TransformUsing(....);

应该生成如下所示的 SQL:

select
    tab.id
    packName.fnName(p1 => tab0_.id, p2 => 5) as col_0_0_,
    packName.fnName(p1 => tab0_.id, p2 => 7) as col_0_1_
from
    Table tab0_

请注意,如果您想将此函数与 Criteria、QueryOver 或 LINQ-to-NHibernate 一起使用,则可以,并且不需要太多步骤即可实现。

【讨论】:

    【解决方案2】:

    看来你可以使用公式来实现这一点,

    <property name="FnName1" formula="(SELECT packName.fnName(p1 => tab.id, p2 => 5) FROM table tab)"/>
    <property name="FnName2" formula="(SELECT packName.fnName(p1 => tab.id, p2 => 7) FROM table tab)"/>
    

    参考:http://ayende.com/blog/3936/nhibernate-mapping-property

    【讨论】:

    • 我只想在必要时选择这个FnName,在大多数情况下不需要进行额外的子选择。我需要一个特定的 NHibernate 映射吗?还是有其他解决方案?
    • 我在这里害怕的是:需要一个额外的Entity 和这个特定案例的映射文件......
    • 您可以将其映射到实际需要值的现有实体并将其设置为惰性,然后它只会在您实际访问该值时执行。
    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2017-01-06
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多