HQL通过传递特性值插入实体引用

本文关键字:插入 实体 引用 HQL | 更新日期: 2023-09-27 18:28:29

我在为我的搜索词排序所有谷歌结果时遇到问题;太多的信息是关闭,但不是我要找的,所以…转到StackOverflow!

我有三个表,StocksStockPropertiesStockPropertyTypes

一个Stock记录具有零个或多个与其关联的StockProperties,并且具有唯一列symbol。每个StockProperty记录恰好有一个对StockPropertyType的引用,以及恰好有一次对Stock的引用。StockPropertyTypes表具有唯一的列code。这些表的实体没有引用的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表和StockPropertyTypes没有关系。看起来这应该是一些嵌套的HQL查询,但我不确定如何区分属性和引用的实体。

有人能告诉我HQL查询应该是什么样子吗?

我应该补充一点,我在这里的目标是通过一次db之旅来实现这一点;我不想在创建StockProperty记录之前加载StockStockPropertyType实体。

HQL通过传递特性值插入实体引用

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

正如您所提到的,这需要额外访问DB。避免这种情况的一种方法是直接执行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>()范例在单个DB调用中加载StockStockPropertyType

或者

您可以尝试在hibernate映射文件中摆弄<sql-insert>。这样可以更好地控制插入的生成方式。您可能需要添加一些仅在insert期间使用的属性StockIdStockPropertyTypeId