gpt4 book ai didi

nhibernate - System.NullReferenceException 尝试预先加载根实体上关联的 IDICTIONARY。你看到这个 HQL 有什么问题吗?

转载 作者:行者123 更新时间:2023-12-02 03:39:15 24 4
gpt4 key购买 nike

编辑 - 在 hibernate jira 发现完全相同的问题这说解决了。这仍然是 NHibernate 的问题吗

DB Schema . Category 与 Department 是多对一的关系。 DepartmentDescription 表以多种语言保存部门的描述。

这些是 C# 中的实体及其 Nhibernate 映射。我已将 DepartmentDescriptions 建模为 Department 上的 IDictionary

public class Category
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Department Department { get; set; }
}

public class Department
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IDictionary<string, string> Description { get; set; }
}

类别映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NH.Domain" namespace="NH.Domain">
<class name="Category" table="Category">
<id name="Id" column="Id">
<generator class="identity"></generator>
</id>
<property name="Name" column="Name"></property>
<many-to-one name="Department" column="DepartmentId" class="Department"></many-to-one>
</class>
</hibernate-mapping>

部门映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NH.Domain" namespace="NH.Domain">
<class name="Department" table="Department">
<id name="Id" column="Id">
<generator class="identity"></generator>
</id>
<property name="Name" column="Name"></property>
<map name="Description" table="DepartmentDescription">
<key column="DepartmentId"></key>
<index column="LanguageCode" type="string"></index>
<element column="Description" type="string"></element>
</map>
</class>
</hibernate-mapping>

这是我用来获取类别并急切加载其部门的 HQL

select c from Category as c 
join fetch c.Department as dept
join fetch dept.Description as desc
where c.Id=1

在执行此 HQL 时,我得到一个 system.nullreferenceexception - 表示对象未设置为对象的引用。这是堆栈跟踪

at NHibernate.Loader.BasicLoader.IsBag(ICollectionPersister collectionPersister)
at NHibernate.Loader.BasicLoader.PostInstantiate()
at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader..ctor(QueryTranslatorImpl queryTranslator, ISessionFactoryImplementor factory, SelectClause selectClause)
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary`2 replacements, Boolean shallow)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryString, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLStringQueryPlan.CreateTranslators(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLStringQueryPlan..ctor(String hql, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String queryString, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String query, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String queryString)
at NH.Program.Main(String[] args) in Program.cs:line 32
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

感谢任何帮助。

最佳答案

在这种情况下,我会说,你做的是正确的,但解析器没有正确读取它。无论如何,这是可行的:

select c from Category as c 
join fetch c.Department as dept
// join fetch dept.Description as desc
join fetch c.Department.Description as desc // alias not used
where c.Id=1

这样的查询最后会加入 Department两次...,但结果如您所愿。

为什么这个错误仍然存​​在于 HQL 解析器中(在像 NHibernate 这样的成熟产品中)的原因可能有一个:您正在一些非常具体、罕见的场景中使用。这不是 NHiberante 的借口。但可能/应该是一个标志...

我会建议,而不是使用 IDictinary<ValueType, ValueType> , 给它更多编码 (negative) 并创建包装对象并将其映射为 ILit<MyWrapperObject> .您将获得更多标准行为和更好的查询选项。请查看Nhibernate query for items that have a Dictionary Property containing value

关于nhibernate - System.NullReferenceException 尝试预先加载根实体上关联的 IDICTIONARY。你看到这个 HQL 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21243592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com