NHibernate在子查询中使用联接:不生成联接sql语句
我有一个使用QueryOver的调用,它的布局如下,不生成子查询中所需的内部join语句 我正在查询的对象的结构如下所示:NHibernate在子查询中使用联接:不生成联接sql语句,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我有一个使用QueryOver的调用,它的布局如下,不生成子查询中所需的内部join语句 我正在查询的对象的结构如下所示: public class Product { public virtual long Id { get; set; } ... OTHER DATA MEMBERS ... } public class ProductListType1 { public virtual int Id { get; set; } public virtual
public class Product {
public virtual long Id { get; set; }
... OTHER DATA MEMBERS ...
}
public class ProductListType1 {
public virtual int Id { get; set; }
public virtual DateTime Date { get; set; }
public virtual char Category { get; set; }
... OTHER DATA MEMBERS ...
public virtual IDictionary<short, Detail> Details { get; set; }
public class Detail {
public virtual short SequenceNumber { get; set; }
public virtual ProductListType1 ProductListType1 { get; set; } // PARENT REFERENCE FOR BIDIRECTIONAL RELATIONSHIP
public virtual Product Product { get; set; }
... OTHER DATA ...
}
}
public class ProductListType2 {
// SAME STRUCTURE AS PRODUCT LIST TYPE 1
}
ProductListType1.Detail detailAlias = null;
Product productAlias = null;
ProductListType2 productListType2Alias = null;
ProductListType2.Detail productListType2DetailAlias = null;
_session.QueryOver<ProductListType1>()
.Left.JoinAlias(productListType1 => productListType1.Details, () => detailAlias)
.Left.JoinAlias(() => detailAlias.Product, () => productAlias)
.Where(productListType1 => productListType1.Next == "abc" || productListType1.Final == "abc")
.And(productListType1 => productListType1.Status.IsIn(new string[] { "STATUS1", "STATUS2", "STATUS3", "STATUS4"}))
.WithSubquery.WhereNotExists(QueryOver.Of<ProductListType2.Detail>(() => productListType2DetailAlias)
.Select(productListType2Detail => productListType2Detail.Product.id)
.Inner.JoinAlias(productListType2Detail => productListType2Detail.ProductListType2, () => productListType2Alias)
.Where(productListType2Detail => productListType2Detail.SequenceNumber < 900)
.And(productListType2Detail => productListType2Detail.Product.Id == detailAlias.Product.Id)
.And(() => productListType2Alias.Date == DateTime.Today)
.And(() => productListType2Alias.Category == "D")
)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
有谁能告诉我为什么subquery.JoinAlias()调用没有生成PRODUCT\u LIST\u TYPE2\u表的内部join语句,以及如何让它这样做
我希望它生成的sql是:
SELECT (lots of stuff)
FROM PRODUCT_LIST_TYPE1_TABLE this_
LEFT OUTER JOIN PRODUCT_LIST_TYPE1_DETAILS_TABLE detailalia1_
ON this_.id=detailalia1_.parentId
LEFT OUTER JOIN PRODUCT_TABLE product2_
ON detailalia1_.productId=product2_.id
WHERE (this_.next = ? or this_.dest = ?)
AND this_.stat in (?, ?, ?, ?)
AND NOT EXISTS (
SELECT this_0_.productId as y0_
FROM PRODUCT_LIST_TYPE2_DETAILS_TABLE this_0_
INNER JOIN PRODUCT_LIST_TYPE2_TABLE productlisttype2_ // THIS PART IS MISSING
ON this_0_.parentId=productlisttype2_.id
AND productlisttype2_.date = ?
AND productlisttype2_.type = ?
WHERE this_0_.sequenceNumber < ?
AND this_0_.productId = detailalia1_.pron
); PARAMETERS
到
并尝试在以下位置使用联接查询:
.Inner.JoinQueryOver(productListType2Detail => productListType2DetailAlias.ProductListType2)
这两个更改正在生成相同的sql,其中不存在内部联接。是否可以尝试按如下方式重新分析查询
ProductListType1.Detail detailAlias = null;
Product productAlias = null;
ProductListType2 productListType2Alias = null;
ProductListType2.Detail productListType2DetailAlias = null;
_session.QueryOver<ProductListType1>()
.Left.JoinAlias(productListType1 => productListType1.Details, () => detailAlias)
.Left.JoinAlias(() => detailAlias.Product, () => productAlias)
.Where(productListType1 => productListType1.Next == "abc" || productListType1.Final == "abc")
.And(productListType1 => productListType1.Status.IsIn(new string[] { "STATUS1", "STATUS2", "STATUS3", "STATUS4"}))
.WithSubquery.WhereNotExists(QueryOver.Of<ProductListType2.Detail>(() => productListType2DetailAlias)
.Select(productListType2Detail => productListType2Detail.Product.id)
.Inner.JoinAlias(() => productListType2Detail.ProductListType2, () => productListType2Alias)
.Where(productListType2Detail => productListType2Detail.SequenceNumber < 900)
.And(productListType2Detail => productListType2Detail.Product.Id == detailAlias.Product.Id)
.And(() => productListType2Alias.Date == DateTime.Today)
.And(() => productListType2.Category == "D")
)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
到
我尝试进行您建议的更改,对()=>productListType2Detail.ProductLIstType2的更改甚至不会编译。它表示名称productListType2Detail在当前上下文中不存在。我试图将.Inner.Join的引用更改为使用调用QueryOver.Of(即.Inner.JoinAlias(()=>productListType2DetailAlias.ProductListType2,()=>productListType2Alias)时创建的别名。这将编译,但它生成的sql与以前版本的代码相同;仍然缺少内部联接。
.Inner.JoinAlias(productListType2Detail => productListType2Detail.ProductListType2, () => productListType2Alias)
.Inner.JoinAlias(() => productListType2DetailAlias.ProductListType2, () => productListType2Alias)
.Inner.JoinQueryOver(productListType2Detail => productListType2DetailAlias.ProductListType2)
ProductListType1.Detail detailAlias = null;
Product productAlias = null;
ProductListType2 productListType2Alias = null;
ProductListType2.Detail productListType2DetailAlias = null;
_session.QueryOver<ProductListType1>()
.Left.JoinAlias(productListType1 => productListType1.Details, () => detailAlias)
.Left.JoinAlias(() => detailAlias.Product, () => productAlias)
.Where(productListType1 => productListType1.Next == "abc" || productListType1.Final == "abc")
.And(productListType1 => productListType1.Status.IsIn(new string[] { "STATUS1", "STATUS2", "STATUS3", "STATUS4"}))
.WithSubquery.WhereNotExists(QueryOver.Of<ProductListType2.Detail>(() => productListType2DetailAlias)
.Select(productListType2Detail => productListType2Detail.Product.id)
.Inner.JoinAlias(() => productListType2Detail.ProductListType2, () => productListType2Alias)
.Where(productListType2Detail => productListType2Detail.SequenceNumber < 900)
.And(productListType2Detail => productListType2Detail.Product.Id == detailAlias.Product.Id)
.And(() => productListType2Alias.Date == DateTime.Today)
.And(() => productListType2.Category == "D")
)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
.Inner.JoinAlias(productListType2Detail => productListType2Detail.ProductListType2, () => productListType2Alias)
.Inner.JoinAlias(() => productListType2Detail.ProductListType2, () => productListType2Alias)