NHibernate QueryOver NullReferenceException
NHibernate QueryOver NullReferenceException
我有以下 QueryOver,它在 newExam.ActiveTo 为 null 时抛出 NullReferenceException(ActiveTo 类型是 DateTime?)
Exam examAlias = null;
examsInSameTime = session.QueryOver(() => examAlias)
.Where(() => examAlias.ActiveTo == null && newExam.ActiveTo == null)
.Future<Exam>();
当我将查询重写到此 HQL 时一切正常
var query = "from Exam exam where exam.ActiveTo is null and :newExamActiveTo is null)";
examsInSameTime = session.CreateQuery(query)
.SetParameter("newExamActiveTo", newExam.ActiveTo).List<Exam>();
为什么 QueryOver 会抛出异常而 HQL 不会?
正如 Radim 所写,您在 QueryOver
中使用了一个参数。问题是当你执行查询时 newExam
可能是 null
。
我想说,这里的解决方案应该非常简单和优雅(但前提是我正确阅读了您的问题)。
重点是 - 在 C# 中检查您的参数,不要将其发送到数据库端:
Exam examAlias = null;
var query = session.QueryOver(() => examAlias);
//here we will check what needed
if(newExam.ActiveTo == null)
{
query.Where(() => examAlias.ActiveTo == null)
}
// we can repeat that many times and build WHERE clause as required
...
// finally the query
examsInSameTime = query.Future<Exam>();
所以,这里的技巧是:
- 检查应用端的搜索参数
- 如果需要,将它们转换成 SQL WHERE 语句
- 只在数据库端发送需要的限制
我有以下 QueryOver,它在 newExam.ActiveTo 为 null 时抛出 NullReferenceException(ActiveTo 类型是 DateTime?)
Exam examAlias = null;
examsInSameTime = session.QueryOver(() => examAlias)
.Where(() => examAlias.ActiveTo == null && newExam.ActiveTo == null)
.Future<Exam>();
当我将查询重写到此 HQL 时一切正常
var query = "from Exam exam where exam.ActiveTo is null and :newExamActiveTo is null)";
examsInSameTime = session.CreateQuery(query)
.SetParameter("newExamActiveTo", newExam.ActiveTo).List<Exam>();
为什么 QueryOver 会抛出异常而 HQL 不会?
正如 Radim 所写,您在 QueryOver
中使用了一个参数。问题是当你执行查询时 newExam
可能是 null
。
我想说,这里的解决方案应该非常简单和优雅(但前提是我正确阅读了您的问题)。
重点是 - 在 C# 中检查您的参数,不要将其发送到数据库端:
Exam examAlias = null;
var query = session.QueryOver(() => examAlias);
//here we will check what needed
if(newExam.ActiveTo == null)
{
query.Where(() => examAlias.ActiveTo == null)
}
// we can repeat that many times and build WHERE clause as required
...
// finally the query
examsInSameTime = query.Future<Exam>();
所以,这里的技巧是:
- 检查应用端的搜索参数
- 如果需要,将它们转换成 SQL WHERE 语句
- 只在数据库端发送需要的限制