Hibernate version: 1.2.1.GA
I have the following SQL Query:
Code:
SELECT Company.*
FROM Company
WHERE Company.DeletedOn IS NULL
AND Company.CompanyID IN
(
SELECT Site.CompanyID
FROM Site
INNER JOIN SiteProduct
ON Site.SiteID = SiteProduct.SiteID
AND SiteProduct.DeletedOn IS NULL
AND SiteProduct.IsProduced = 1
INNER JOIN Product
ON SiteProduct.ProductID = Product.ProductID
AND Product.DeletedOn IS NULL
AND Product.IsPublic = 1
WHERE Site.DeletedOn IS NULL
GROUP BY Site.CompanyID
)
Which works fine using this
Code:
ISQLQuery sqlQuery = Session.CreateSQLQuery(stringQuery.ToString()).AddEntity(typeof(Company));
IList<Company> companies = sqlQuery.List<Company>();
However I have been unsuccessful at translating this to ICriteria. Can you help? Below are my attempts:
Code:
DetachedCriteria dcCompany = DetachedCriteria.For(typeof(Company));
dcCompany.Add(Expression.IsNull("DeletedOn"));
dcCompany.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Sites"))
);
DetachedCriteria dcSite = dcCompany.CreateCriteria("Sites");
dcSite.Add(Expression.IsNull("DeletedOn"));
DetachedCriteria dcSiteProduct = dcSite.CreateCriteria("SiteProducts");
dcSiteProduct.Add(Expression.IsNull("DeletedOn"));
dcSiteProduct.Add(Expression.Eq("IsProduced", true));
DetachedCriteria dcProduct = dcSiteProduct.CreateCriteria("Product");
dcProduct.Add(Expression.Eq("IsPublic", true));
ICriteria cCompany = Session.CreateCriteria(typeof(Company));
cCompany.SetMaxResults(maxRecords);
cCompany.Add(Subqueries.In("CompanyID", dcCompany));
and
Code:
ICriteria cCompany = Session.CreateCriteria(typeof(Company));
cCompany.SetMaxResults(maxRecords);
cCompany.Add(Expression.IsNull("DeletedOn"));
cCompany.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Sites"))
);
ICriteria cSite = cCompany.CreateCriteria("Sites");
cSite.Add(Expression.IsNull("DeletedOn"));
ICriteria cSiteProduct = cSite.CreateCriteria("SiteProducts");
cSiteProduct.Add(Expression.IsNull("DeletedOn"));
cSiteProduct.Add(Expression.Eq("IsProduced", true));
ICriteria cProduct = cSiteProduct.CreateCriteria("Product");
cProduct.Add(Expression.Eq("IsPublic", true));
companies = cCompany.List<Company>();