Skip to content

Commit d35233e

Browse files
Iwanow, Mihail (EXT)fredericDelaporte
authored andcommitted
Child collection fetched using left join with restrictions shouldn’t be stored in second level cache
1 parent d0fe800 commit d35233e

File tree

14 files changed

+749
-312
lines changed

14 files changed

+749
-312
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3848
4+
{
5+
public class Company
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual string Name { get; set; }
9+
public virtual Customer Customer { get; set; }
10+
}
11+
}

src/NHibernate.Test/NHSpecificTest/NH3848/CriteriaTestFixture.cs

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Threading.Tasks;
23
using NHibernate.Criterion;
34
using NHibernate.SqlCommand;
45
using NHibernate.Transform;
@@ -18,19 +19,50 @@ protected override IList<Customer> GetCustomersWithFetchedOrdersWithoutRestricti
1819
protected override IList<Customer> GetCustomersWithOrdersEagerLoaded(ISession session)
1920
{
2021
return session.CreateCriteria<Customer>()
21-
.Fetch(SelectMode.Fetch, "Orders")
22-
.SetResultTransformer(new DistinctRootEntityResultTransformer())
22+
.Fetch("Orders")
23+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
2324
.List<Customer>();
2425
}
2526

26-
protected override IList<Customer> GetCustomersByOrderNumberUsingOnClause(ISession session, int orderNumber)
27+
protected override async Task<IList<Customer>> GetCustomersWithOrdersEagerLoadedAsync(ISession session)
28+
{
29+
return await session.CreateCriteria<Customer>()
30+
.Fetch("Orders")
31+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
32+
.ListAsync<Customer>().ConfigureAwait(false);
33+
}
34+
35+
protected override IList<Customer> GetCustomersByOrderNumberUsingOnClause(ISession session, int orderNumber)
2736
{
2837
return session.CreateCriteria<Customer>()
2938
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
3039
.List<Customer>();
3140
}
3241

33-
protected override IList<Customer> GetCustomersByOrderNumberUsingWhereClause(ISession session, int orderNumber)
42+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingOnClauseAsync(ISession session, int orderNumber)
43+
{
44+
return await session.CreateCriteria<Customer>()
45+
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
46+
.ListAsync<Customer>().ConfigureAwait(false);
47+
}
48+
49+
protected override IList<Customer> GetCustomersWithCompaniesByOrderNumberUsingOnClause(ISession session, int orderNumber)
50+
{
51+
return session.CreateCriteria<Customer>()
52+
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
53+
.CreateAlias("Companies", "company", JoinType.LeftOuterJoin)
54+
.List<Customer>();
55+
}
56+
57+
protected override async Task<IList<Customer>> GetCustomersWithCompaniesByOrderNumberUsingOnClauseAsync(ISession session, int orderNumber)
58+
{
59+
return await session.CreateCriteria<Customer>()
60+
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
61+
.CreateAlias("Companies", "company", JoinType.LeftOuterJoin)
62+
.ListAsync<Customer>().ConfigureAwait(false);
63+
}
64+
65+
protected override IList<Customer> GetCustomersByOrderNumberUsingWhereClause(ISession session, int orderNumber)
3466
{
3567
return session.CreateCriteria<Customer>()
3668
.CreateCriteria("Orders", "Order", JoinType.LeftOuterJoin)
@@ -39,7 +71,16 @@ protected override IList<Customer> GetCustomersByOrderNumberUsingWhereClause(ISe
3971
.List<Customer>();
4072
}
4173

42-
protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession session, string customerName)
74+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingWhereClauseAsync(ISession session, int orderNumber)
75+
{
76+
return await session.CreateCriteria<Customer>()
77+
.CreateCriteria("Orders", "Order", JoinType.LeftOuterJoin)
78+
.Add(Restrictions.Eq("Number", orderNumber))
79+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
80+
.ListAsync<Customer>().ConfigureAwait(false);
81+
}
82+
83+
protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession session, string customerName)
4384
{
4485
return session.CreateCriteria<Customer>()
4586
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin)
@@ -48,7 +89,16 @@ protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession s
4889
.List<Customer>();
4990
}
5091

51-
protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClause(ISession session, int orderNumber, string customerName)
92+
protected override async Task<IList<Customer>> GetCustomersByNameUsingWhereClauseAsync(ISession session, string customerName)
93+
{
94+
return await session.CreateCriteria<Customer>()
95+
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin)
96+
.Add(Restrictions.Eq("Name", "First Customer"))
97+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
98+
.ListAsync<Customer>().ConfigureAwait(false);
99+
}
100+
101+
protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClause(ISession session, int orderNumber, string customerName)
52102
{
53103
var detachedCriteria = DetachedCriteria.For<Customer>()
54104
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
@@ -62,9 +112,29 @@ protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndBy
62112
.List<Customer>();
63113
}
64114

65-
protected override IList<Customer> GetAllCustomers(ISession session)
115+
116+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClauseAsync(ISession session, int orderNumber, string customerName)
117+
{
118+
var detachedCriteria = DetachedCriteria.For<Customer>()
119+
.CreateAlias("Orders", "order", JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
120+
.SetProjection(Projections.Id());
121+
122+
return await session.CreateCriteria<Customer>()
123+
.CreateAlias("Orders", "order1", JoinType.LeftOuterJoin)
124+
.Add(Subqueries.PropertyIn("Id", detachedCriteria))
125+
.Add(Restrictions.Eq("Name", customerName))
126+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
127+
.ListAsync<Customer>().ConfigureAwait(false);
128+
}
129+
130+
protected override IList<Customer> GetAllCustomers(ISession session)
66131
{
67132
return session.CreateCriteria<Customer>().List<Customer>();
68-
}
69-
}
133+
}
134+
135+
protected override async Task<IList<Customer>> GetAllCustomersAsync(ISession session)
136+
{
137+
return await session.CreateCriteria<Customer>().ListAsync<Customer>().ConfigureAwait(false);
138+
}
139+
}
70140
}

src/NHibernate.Test/NHSpecificTest/NH3848/Customer.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,25 @@ public class Customer
77
{
88
public virtual Guid Id { get; set; }
99
public virtual ISet<Order> Orders { get; set; }
10+
public virtual ISet<Company> Companies { get; set; }
1011
public virtual string Name { get; set; }
1112

1213
public Customer()
1314
{
1415
Orders = new HashSet<Order>();
16+
Companies = new HashSet<Company>();
1517
}
1618

1719
public virtual void AddOrder(Order order)
1820
{
1921
Orders.Add(order);
2022
order.Customer = this;
2123
}
22-
}
24+
25+
public virtual void AddCompany(Company company)
26+
{
27+
Companies.Add(company);
28+
company.Customer = this;
29+
}
30+
}
2331
}

src/NHibernate.Test/NHSpecificTest/NH3848/QueryOverTestFixture.cs

Lines changed: 106 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Threading.Tasks;
23
using NHibernate.Criterion;
34
using NHibernate.SqlCommand;
45
using NHibernate.Transform;
@@ -21,12 +22,20 @@ protected override IList<Customer> GetCustomersWithFetchedOrdersWithoutRestricti
2122
protected override IList<Customer> GetCustomersWithOrdersEagerLoaded(ISession session)
2223
{
2324
return session.QueryOver<Customer>()
24-
.Fetch(SelectMode.Fetch, n => n.Orders)
25-
.TransformUsing(new DistinctRootEntityResultTransformer())
25+
.Fetch(SelectMode.Fetch, n => n.Orders)
26+
.TransformUsing(new DistinctRootEntityResultTransformer())
2627
.List();
2728
}
2829

29-
protected override IList<Customer> GetCustomersByOrderNumberUsingOnClause(ISession session, int orderNumber)
30+
protected override async Task<IList<Customer>> GetCustomersWithOrdersEagerLoadedAsync(ISession session)
31+
{
32+
return await session.QueryOver<Customer>()
33+
.Fetch(SelectMode.Fetch, n => n.Orders)
34+
.TransformUsing(new DistinctRootEntityResultTransformer())
35+
.ListAsync().ConfigureAwait(false);
36+
}
37+
38+
protected override IList<Customer> GetCustomersByOrderNumberUsingOnClause(ISession session, int orderNumber)
3039
{
3140
Order ordersAlias = null;
3241
return session.QueryOver<Customer>()
@@ -37,16 +46,69 @@ protected override IList<Customer> GetCustomersByOrderNumberUsingOnClause(ISessi
3746
.List();
3847
}
3948

40-
protected override IList<Customer> GetCustomersByOrderNumberUsingWhereClause(ISession session, int orderNumber)
49+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingOnClauseAsync(ISession session, int orderNumber)
50+
{
51+
Order ordersAlias = null;
52+
53+
return await session.QueryOver<Customer>()
54+
.JoinAlias(n => n.Orders,
55+
() => ordersAlias,
56+
JoinType.LeftOuterJoin,
57+
Restrictions.Eq("Number", orderNumber))
58+
.ListAsync().ConfigureAwait(false);
59+
}
60+
61+
protected override IList<Customer> GetCustomersWithCompaniesByOrderNumberUsingOnClause(ISession session, int orderNumber)
62+
{
63+
Order ordersAlias = null;
64+
Company companiesAlias = null;
65+
66+
return session.QueryOver<Customer>()
67+
.JoinAlias(n => n.Orders,
68+
() => ordersAlias,
69+
JoinType.LeftOuterJoin,
70+
Restrictions.Eq("Number", orderNumber))
71+
.JoinAlias(n => n.Companies,
72+
() => companiesAlias,
73+
JoinType.LeftOuterJoin)
74+
.List();
75+
}
76+
77+
protected override async Task<IList<Customer>> GetCustomersWithCompaniesByOrderNumberUsingOnClauseAsync(ISession session, int orderNumber)
78+
{
79+
Order ordersAlias = null;
80+
Company companiesAlias = null;
81+
82+
return await session.QueryOver<Customer>()
83+
.JoinAlias(n => n.Orders,
84+
() => ordersAlias,
85+
JoinType.LeftOuterJoin,
86+
Restrictions.Eq("Number", orderNumber))
87+
.JoinAlias(n => n.Companies,
88+
() => companiesAlias,
89+
JoinType.LeftOuterJoin)
90+
.ListAsync().ConfigureAwait(false);
91+
}
92+
93+
protected override IList<Customer> GetCustomersByOrderNumberUsingWhereClause(ISession session, int orderNumber)
4194
{
4295
Order ordersAlias = null;
4396
return session.QueryOver<Customer>()
4497
.JoinQueryOver(n => n.Orders, () => ordersAlias, JoinType.LeftOuterJoin)
45-
.Where(Restrictions.Eq("Number", orderNumber))
98+
.Where(Restrictions.Eq("Number", orderNumber))
4699
.List();
47100
}
48101

49-
protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession session, string customerName)
102+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingWhereClauseAsync(ISession session, int orderNumber)
103+
{
104+
Order ordersAlias = null;
105+
return await session.QueryOver<Customer>()
106+
.JoinQueryOver(n => n.Orders, () => ordersAlias, JoinType.LeftOuterJoin)
107+
.Where(Restrictions.Eq("Number", orderNumber))
108+
.ListAsync().ConfigureAwait(false);
109+
}
110+
111+
protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession session, string customerName)
50112
{
51113
Order ordersAlias = null;
52114
return session.QueryOver<Customer>()
@@ -60,7 +122,21 @@ protected override IList<Customer> GetCustomersByNameUsingWhereClause(ISession s
60122

61123
}
62124

63-
protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClause(ISession session, int orderNumber, string customerName)
125+
protected override async Task<IList<Customer>> GetCustomersByNameUsingWhereClauseAsync(ISession session, string customerName)
126+
{
127+
Order ordersAlias = null;
128+
129+
return await session.QueryOver<Customer>()
130+
.JoinAlias(n => n.Orders,
131+
() => ordersAlias,
132+
JoinType.LeftOuterJoin
133+
)
134+
.Where(Restrictions.Eq("Name", customerName))
135+
.TransformUsing(new DistinctRootEntityResultTransformer())
136+
.ListAsync().ConfigureAwait(false);
137+
}
138+
139+
protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClause(ISession session, int orderNumber, string customerName)
64140
{
65141
Order ordersAlias = null;
66142
Order ordersAlias2 = null;
@@ -76,9 +152,30 @@ protected override IList<Customer> GetCustomersByOrderNumberUsingSubqueriesAndBy
76152
.List();
77153
}
78154

79-
protected override IList<Customer> GetAllCustomers(ISession session)
155+
protected override async Task<IList<Customer>> GetCustomersByOrderNumberUsingSubqueriesAndByNameUsingWhereClauseAsync(ISession session, int orderNumber, string customerName)
156+
{
157+
Order ordersAlias = null;
158+
Order ordersAlias2 = null;
159+
var subquery = QueryOver.Of<Customer>()
160+
.JoinAlias(n => n.Orders, () => ordersAlias, JoinType.LeftOuterJoin, Restrictions.Eq("Number", orderNumber))
161+
.Select(n => n.Id);
162+
163+
return await session.QueryOver<Customer>()
164+
.JoinAlias(n => n.Orders, () => ordersAlias2, JoinType.LeftOuterJoin)
165+
.WithSubquery.WhereProperty(n => n.Id).In(subquery)
166+
.Where(Restrictions.Eq("Name", customerName))
167+
.TransformUsing(new DistinctRootEntityResultTransformer())
168+
.ListAsync().ConfigureAwait(false);
169+
}
170+
171+
protected override IList<Customer> GetAllCustomers(ISession session)
80172
{
81173
return session.QueryOver<Customer>().List();
82174
}
83-
}
175+
176+
protected override async Task<IList<Customer>> GetAllCustomersAsync(ISession session)
177+
{
178+
return await session.QueryOver<Customer>().ListAsync().ConfigureAwait(false);
179+
}
180+
}
84181
}

0 commit comments

Comments
 (0)