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

时间:2015-12-30 19:13:34

标签: c# nhibernate hql

我在搜索所有搜索字词的Google搜索结果时遇到问题;太多的信息关闭但不是我正在寻找的信息,所以......关闭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旅行来做到这一点;我不想在创建Stock记录之前加载StockPropertyTypeStockProperty个实体。

1 个答案:

答案 0 :(得分:1)

执行此操作的典型方法是从StockPropertyType加载ISessionStockProperty。然后使用ISession.Save()创建session .CreateSQLQuery(@"insert into StockProperty(StockSymbol, Value, TypeCode) values (:stockSymbol, :value, :typeCode)") .SetProperty("stockSymbol", stockSymbol) .SetProperty("value", value) .SetProperty("typeCode", typeCode) .ExecuteUpdate(); 以保存。

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

Stock

你在这里绕过NHibernate,但效率更高。

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

<强> 另外...

您可以尝试在hibernate映射文件中摆弄StockId。这使您可以更好地控制插入的生成方式。您可能希望添加仅在StockPropertyTypeId期间使用的一些属性insert和{{1}}。