HQL通过传递特性值插入实体引用
本文关键字:插入 实体 引用 HQL | 更新日期: 2023-09-27 18:28:29
我在为我的搜索词排序所有谷歌结果时遇到问题;太多的信息是关闭,但不是我要找的,所以…转到StackOverflow!
我有三个表,Stocks
、StockProperties
和StockPropertyTypes
。
一个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
记录之前加载Stock
和StockPropertyType
实体。
ISession
加载Stock
和StockPropertyType
。然后使用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调用中加载Stock
和StockPropertyType
。
或者
您可以尝试在hibernate映射文件中摆弄<sql-insert>
。这样可以更好地控制插入的生成方式。您可能需要添加一些仅在insert
期间使用的属性StockId
和StockPropertyTypeId
。