我在使用一个属性名称与列名称不匹配的对象指定QueryOver order by子句时遇到了问题。
这是对象: -
public class ObjectInstance
{
public ObjectInstance()
{
IsActive = true;
}
public virtual bool IsActive { get; set; }
}
和hibernate流畅的映射: -
public class ObjectInstanceMap : ClassMap<ObjectInstance>
{
public ObjectInstanceMap()
{
Table("ObjectInstances");
Id(obj => obj.ObjectInstanceId).GeneratedBy.GuidComb();
Map(x => x.IsActive, "ObjectInstanceIsActive");
}
}
如您所见,数据库中的列名为ObjectInstanceIsActive,但正在映射到ObjectInstance对象上的IsActive属性。尝试使用QueryOver获取IList,如下所示: -
IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
.UnderlyingCriteria.AddOrder(new Order("ObjectInstanceIsActive", true))
.List<ObjectInstance>();
引发一个错误,指出ObjectInstance对象没有ObjectInstanceIsActive属性,这是正确的,它没有。
如果我将标准更改为: -
IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
.UnderlyingCriteria.AddOrder(new Order("IsActive", true))
.List<ObjectInstance>();
然后Hibernate成功生成一个SQL查询,但它正在寻找一个名为IsActive的列,它不存在和错误。
我还尝试添加以下预测(单独),但这并没有帮助。
.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"), "ObjectInstanceIsActive"))
.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"), "ObjectInstanceIsActive"))
答案 0 :(得分:1)
IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
.UnderlyingCriteria.AddOrder(new Order("IsActive", true))
.List<ObjectInstance>();
对我来说工作实际上很好,按预期创建以下语句:
SELECT this_.ObjectInstanceId as ObjectIn1_19_0_, this_.ObjectInstanceIsActive as
ObjectIn2_19_0_ FROM ObjectInstances this_
ORDER BY this_.ObjectInstanceIsActive asc
答案 1 :(得分:1)
流畅的映射和查询本身看起来很好。再次检查在使用new Order("IsActive", true)
的情况下生成的SQL是什么......这是可疑的。
顺便说一句,更流畅(和类型安全)的语法是:
var result = Session
.QueryOver<ObjectInstance>(() => objectInstance)
.OrderBy(() => objectInstance.IsActive)
.Asc
.List<ObjectInstance>();
答案 2 :(得分:0)
看起来我过度简化了我的例子。 ObjectInstance是一个基类,作为一个独立的东西,一切都像MichaC和Radim指出的那样完美。在我的特定场景中,我有一个继承自它的子类,它将IsActive列重新映射到一个不被注意的不同别名下。
干杯队员。