Skip to content

Commit b1db0b5

Browse files
mazharqayyumhazzik
authored andcommitted
Fix NullReferenceException in AliasToBeanResultTransformer (#1380)
Fixes #750
1 parent 8c820c8 commit b1db0b5

File tree

7 files changed

+424
-1
lines changed

7 files changed

+424
-1
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Collections.Generic;
12+
using NHibernate.Criterion;
13+
using NHibernate.Transform;
14+
using NUnit.Framework;
15+
16+
namespace NHibernate.Test.NHSpecificTest.GH0750
17+
{
18+
using System.Threading.Tasks;
19+
using System.Threading;
20+
21+
[TestFixture]
22+
public class FixtureAsync : BugTestCase
23+
{
24+
protected override void OnSetUp()
25+
{
26+
using (ISession session = OpenSession())
27+
using (ITransaction tx = session.BeginTransaction())
28+
{
29+
var greenTea = new Product()
30+
{
31+
ProductId = 1,
32+
Name = "Green Tea",
33+
UnitPrice = 5
34+
};
35+
36+
session.Save(greenTea);
37+
38+
var blackTea = new Product()
39+
{
40+
ProductId = 2,
41+
Name = "Black Tea",
42+
UnitPrice = 10
43+
};
44+
45+
session.Save(blackTea);
46+
47+
var greenTeaOrder = new Order()
48+
{
49+
OrderId = 1,
50+
OrderDate = System.DateTime.Now
51+
};
52+
53+
session.Save(greenTeaOrder);
54+
55+
greenTeaOrder.OrderLines.Add(new OrderLine() { Order = greenTeaOrder, Product = greenTea, Quantity = 2, UnitPrice = greenTea.UnitPrice ?? 0 });
56+
57+
session.Save(greenTeaOrder);
58+
59+
var blackTeaOrder = new Order()
60+
{
61+
OrderId = 2,
62+
OrderDate = System.DateTime.Now
63+
};
64+
65+
session.Save(blackTeaOrder);
66+
67+
blackTeaOrder.OrderLines.Add(new OrderLine() { Order = blackTeaOrder, Product = blackTea, Quantity = 5, UnitPrice = blackTea.UnitPrice ?? 0 });
68+
69+
session.Save(blackTeaOrder);
70+
tx.Commit();
71+
}
72+
}
73+
74+
protected override void OnTearDown()
75+
{
76+
using (var s = OpenSession())
77+
using (var tx = s.BeginTransaction())
78+
{
79+
s.CreateQuery("delete from OrderLine").ExecuteUpdate();
80+
s.CreateQuery("delete from System.Object").ExecuteUpdate();
81+
tx.Commit();
82+
}
83+
}
84+
85+
[Test]
86+
public void MapQueryResultWithAliasToBeanTransformerAsync()
87+
{
88+
Assert.DoesNotThrowAsync(() => GetSaleSummariesAsync());
89+
}
90+
91+
public async Task<IList<ProductSummary>> GetSaleSummariesAsync(CancellationToken cancellationToken = default(CancellationToken))
92+
{
93+
using (var session = OpenSession())
94+
using (var tx = session.BeginTransaction())
95+
{
96+
var criteria = session
97+
.CreateCriteria<Order>("O")
98+
.CreateCriteria("O.OrderLines", "OI", SqlCommand.JoinType.InnerJoin)
99+
.CreateCriteria("OI.Product", "P", SqlCommand.JoinType.InnerJoin);
100+
101+
var summaeries = await (criteria
102+
.SetProjection(Projections.ProjectionList().Add(Projections.Property("P.ProductId"), "ProductId")
103+
.Add(Projections.Property("P.Name"), "Name")
104+
.Add(Projections.Sum(Projections.Cast(NHibernateUtil.Int32, Projections.Property("OI.Quantity"))), "TotalQuantity")
105+
.Add(Projections.Sum("OI.UnitPrice"), "TotalPrice")
106+
.Add(Projections.GroupProperty("P.ProductId"))
107+
.Add(Projections.GroupProperty("P.Name")))
108+
.SetResultTransformer(Transformers.AliasToBean(typeof(ProductSummary)))
109+
.ListAsync<ProductSummary>(cancellationToken));
110+
await (tx.CommitAsync(cancellationToken));
111+
return summaeries;
112+
}
113+
}
114+
}
115+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
using System.Collections.Generic;
2+
using NHibernate.Criterion;
3+
using NHibernate.Transform;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.NHSpecificTest.GH0750
7+
{
8+
public class ProductSummary
9+
{
10+
public int ProductId { get; set; }
11+
12+
public string Name { get; set; }
13+
14+
public int TotalQuantity { get; set; }
15+
16+
public decimal TotalPrice { get; set; }
17+
}
18+
19+
[TestFixture]
20+
public class Fixture : BugTestCase
21+
{
22+
protected override void OnSetUp()
23+
{
24+
using (ISession session = OpenSession())
25+
using (ITransaction tx = session.BeginTransaction())
26+
{
27+
var greenTea = new Product()
28+
{
29+
ProductId = 1,
30+
Name = "Green Tea",
31+
UnitPrice = 5
32+
};
33+
34+
session.Save(greenTea);
35+
36+
var blackTea = new Product()
37+
{
38+
ProductId = 2,
39+
Name = "Black Tea",
40+
UnitPrice = 10
41+
};
42+
43+
session.Save(blackTea);
44+
45+
var greenTeaOrder = new Order()
46+
{
47+
OrderId = 1,
48+
OrderDate = System.DateTime.Now
49+
};
50+
51+
session.Save(greenTeaOrder);
52+
53+
greenTeaOrder.OrderLines.Add(new OrderLine() { Order = greenTeaOrder, Product = greenTea, Quantity = 2, UnitPrice = greenTea.UnitPrice ?? 0 });
54+
55+
session.Save(greenTeaOrder);
56+
57+
var blackTeaOrder = new Order()
58+
{
59+
OrderId = 2,
60+
OrderDate = System.DateTime.Now
61+
};
62+
63+
session.Save(blackTeaOrder);
64+
65+
blackTeaOrder.OrderLines.Add(new OrderLine() { Order = blackTeaOrder, Product = blackTea, Quantity = 5, UnitPrice = blackTea.UnitPrice ?? 0 });
66+
67+
session.Save(blackTeaOrder);
68+
tx.Commit();
69+
}
70+
}
71+
72+
protected override void OnTearDown()
73+
{
74+
using (var s = OpenSession())
75+
using (var tx = s.BeginTransaction())
76+
{
77+
s.CreateQuery("delete from OrderLine").ExecuteUpdate();
78+
s.CreateQuery("delete from System.Object").ExecuteUpdate();
79+
tx.Commit();
80+
}
81+
}
82+
83+
[Test]
84+
public void MapQueryResultWithAliasToBeanTransformer()
85+
{
86+
Assert.DoesNotThrow(() => GetSaleSummaries());
87+
}
88+
89+
public IList<ProductSummary> GetSaleSummaries()
90+
{
91+
using (var session = OpenSession())
92+
using (var tx = session.BeginTransaction())
93+
{
94+
var criteria = session
95+
.CreateCriteria<Order>("O")
96+
.CreateCriteria("O.OrderLines", "OI", SqlCommand.JoinType.InnerJoin)
97+
.CreateCriteria("OI.Product", "P", SqlCommand.JoinType.InnerJoin);
98+
99+
var summaeries = criteria
100+
.SetProjection(Projections.ProjectionList().Add(Projections.Property("P.ProductId"), "ProductId")
101+
.Add(Projections.Property("P.Name"), "Name")
102+
.Add(Projections.Sum(Projections.Cast(NHibernateUtil.Int32, Projections.Property("OI.Quantity"))), "TotalQuantity")
103+
.Add(Projections.Sum("OI.UnitPrice"), "TotalPrice")
104+
.Add(Projections.GroupProperty("P.ProductId"))
105+
.Add(Projections.GroupProperty("P.Name")))
106+
.SetResultTransformer(Transformers.AliasToBean(typeof(ProductSummary)))
107+
.List<ProductSummary>();
108+
tx.Commit();
109+
return summaeries;
110+
}
111+
}
112+
}
113+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test"
3+
namespace="NHibernate.Test.NHSpecificTest.GH0750">
4+
5+
<class name="Order" table="Orders">
6+
<id name="OrderId" column="OrderId" type="int" unsaved-value="0"
7+
access="field.camelcase-underscore">
8+
<generator class="assigned"/>
9+
</id>
10+
<property name="OrderDate" column="OrderDate" type="DateTime"
11+
access="field.camelcase-underscore"/>
12+
<set name="OrderLines" lazy="true" access="field.camelcase-underscore"
13+
cascade="all-delete-orphan" inverse="true">
14+
<key column="OrderId"/>
15+
<one-to-many class="OrderLine"/>
16+
</set>
17+
</class>
18+
19+
<class name="OrderLine" table="OrderLines">
20+
<id name="OrderLineId" column="OrderLineId" type="int" unsaved-value="0"
21+
access="field.camelcase-underscore">
22+
<generator class="native"/>
23+
</id>
24+
<many-to-one name="Order" class="Order" column="OrderId" not-null="true"
25+
access="field.camelcase-underscore" fetch="select"/>
26+
<many-to-one name="Product" class="Product" column="ProductId" not-null="true"
27+
access="field.camelcase-underscore" fetch="select"/>
28+
<property name="UnitPrice" column="UnitPrice" type="Decimal"
29+
not-null="true" access="field.camelcase-underscore"/>
30+
<property name="Quantity" column="Quantity" type="int"
31+
not-null="true" access="field.camelcase-underscore"/>
32+
</class>
33+
34+
<class name="Product" table="Products">
35+
<id name="ProductId" column="ProductId" type="int" unsaved-value="0" access="field.camelcase-underscore">
36+
<generator class="assigned"/>
37+
</id>
38+
<property name="Name" column="ProductName" type="string" length="40" not-null="true"
39+
access="field.camelcase-underscore"/>
40+
<property name="UnitPrice" column="UnitPrice" type="Decimal" access="field.camelcase-underscore"/>
41+
<bag name="OrderLines" lazy="true" access="field.camelcase-underscore" cascade="none">
42+
<key column="ProductId"/>
43+
<one-to-many class="OrderLine"/>
44+
</bag>
45+
</class>
46+
47+
</hibernate-mapping>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace NHibernate.Test.NHSpecificTest.GH0750
5+
{
6+
public class Order
7+
{
8+
private readonly ISet<OrderLine> _orderLines;
9+
private DateTime? _orderDate;
10+
private int _orderId;
11+
12+
public Order()
13+
{
14+
_orderLines = new HashSet<OrderLine>();
15+
}
16+
17+
public virtual int OrderId
18+
{
19+
get { return _orderId; }
20+
set { _orderId = value; }
21+
}
22+
23+
public virtual DateTime? OrderDate
24+
{
25+
get { return _orderDate; }
26+
set { _orderDate = value; }
27+
}
28+
29+
public virtual ISet<OrderLine> OrderLines
30+
{
31+
get { return _orderLines; }
32+
}
33+
34+
public virtual void AddOrderLine(OrderLine orderLine)
35+
{
36+
if (!_orderLines.Contains(orderLine))
37+
{
38+
orderLine.Order = this;
39+
_orderLines.Add(orderLine);
40+
}
41+
}
42+
43+
public virtual void RemoveOrderLine(OrderLine orderLine)
44+
{
45+
if (_orderLines.Contains(orderLine))
46+
{
47+
_orderLines.Remove(orderLine);
48+
orderLine.Order = null;
49+
}
50+
}
51+
}
52+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
namespace NHibernate.Test.NHSpecificTest.GH0750
2+
{
3+
public class OrderLine
4+
{
5+
private int _orderLineId;
6+
private Order _order;
7+
private Product _product;
8+
private int _quantity;
9+
private decimal _unitPrice;
10+
11+
public OrderLine() : this(null, null)
12+
{
13+
}
14+
15+
public OrderLine(Order order, Product product)
16+
{
17+
_order = order;
18+
_product = product;
19+
}
20+
21+
public virtual int OrderLineId
22+
{
23+
get { return _orderLineId; }
24+
set { _orderLineId = value; }
25+
}
26+
27+
public virtual Order Order
28+
{
29+
get { return _order; }
30+
set { _order = value; }
31+
}
32+
33+
public virtual Product Product
34+
{
35+
get { return _product; }
36+
set { _product = value; }
37+
}
38+
39+
public virtual decimal UnitPrice
40+
{
41+
get { return _unitPrice; }
42+
set { _unitPrice = value; }
43+
}
44+
45+
public virtual int Quantity
46+
{
47+
get { return _quantity; }
48+
set { _quantity = value; }
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)