HQL 通过传递 属性 值来插入实体引用?

HQL to insert entity references by passing property values?

我在为我的搜索字词整理所有 Google 结果时遇到问题; close 但不是我要找的信息太多,所以...去 Whosebug!

我有三个 table、StocksStockPropertiesStockPropertyTypes

一个 Stock 记录有零个或多个 StockProperties 与之关联,并且有一个唯一的列 symbol。每个 StockProperty 记录恰好有一个对 StockPropertyType 的引用,并且恰好有一个对 Stock 的引用。 StockPropertyTypes table 有一个唯一的列 code。这些 table 的实体没有引用的 FK id,只有 类。例如,StockProperty 实体看起来像:

public class StockProperty
{
    public virtual Guid StockPropertyId { get; set; }

    public virtual Stock Stock { get; set; }

    public virtual string PropertyValue { get; set; }

    public virtual StockPropertyType Type { get; set; }
}

我想将股票代码、类型代码和值传递给方法,并使用 HQL 创建 StockProperty 记录,但我不确定如何编写该查询。 Stocks table 和 StockPropertyTypes 没有关系。看起来这应该是一些嵌套的 HQL 查询,但我不确定如何区分 属性 和引用的实体。

谁能告诉我 HQL 查询应该是什么样子的?

我应该补充一点,我的目标是通过一次数据库旅行来完成;我不想在创建 StockProperty 记录之前加载 StockStockPropertyType 实体。

执行此操作的典型方法是从 ISession 加载 StockStockPropertyType。然后创建一个 StockProperty 以使用 ISession.Save().

保存

正如您提到的,这需要多次访问数据库。避免这种情况的一种方法是直接执行 SQL 如下:

session
    .CreateSQLQuery(@"insert
                      into StockProperty(StockSymbol, Value, TypeCode)
                      values (:stockSymbol, :value, :typeCode)")
    .SetProperty("stockSymbol", stockSymbol)
    .SetProperty("value", value)
    .SetProperty("typeCode", typeCode)
    .ExecuteUpdate();

你在这里有点绕过 NHibernate,但它更有效。

就我个人而言,除非您遇到瓶颈,否则我会考虑将相关实体加载到内存中。您可以使用 Future<T>() 范例在单个数据库调用中同时加载 StockStockPropertyType

或者...

您可以尝试在休眠映射文件中修改 <sql-insert>。这使您可以更好地控制插入的生成方式。您可能想要添加一些仅在 insert.

期间使用的属性 StockIdStockPropertyTypeId