HQL 通过传递 属性 值来插入实体引用?
HQL to insert entity references by passing property values?
我在为我的搜索字词整理所有 Google 结果时遇到问题; close 但不是我要找的信息太多,所以...去 Whosebug!
我有三个 table、Stocks
、StockProperties
和 StockPropertyTypes
。
一个 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
记录之前加载 Stock
和 StockPropertyType
实体。
执行此操作的典型方法是从 ISession
加载 Stock
和 StockPropertyType
。然后创建一个 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>()
范例在单个数据库调用中同时加载 Stock
和 StockPropertyType
。
或者...
您可以尝试在休眠映射文件中修改 <sql-insert>
。这使您可以更好地控制插入的生成方式。您可能想要添加一些仅在 insert
.
期间使用的属性 StockId
和 StockPropertyTypeId
我在为我的搜索字词整理所有 Google 结果时遇到问题; close 但不是我要找的信息太多,所以...去 Whosebug!
我有三个 table、Stocks
、StockProperties
和 StockPropertyTypes
。
一个 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
记录之前加载 Stock
和 StockPropertyType
实体。
执行此操作的典型方法是从 ISession
加载 Stock
和 StockPropertyType
。然后创建一个 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>()
范例在单个数据库调用中同时加载 Stock
和 StockPropertyType
。
或者...
您可以尝试在休眠映射文件中修改 <sql-insert>
。这使您可以更好地控制插入的生成方式。您可能想要添加一些仅在 insert
.
StockId
和 StockPropertyTypeId