diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs
new file mode 100644
index 00000000000..0a1d6d97655
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs
@@ -0,0 +1,58 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by AsyncGenerator.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+using System.Linq;
+using NHibernate.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3288
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class FetchAndCollectionJoinFixtureAsync : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using var session = OpenSession();
+ using var transaction = session.BeginTransaction();
+ var middleEntity = new MiddleEntity();
+ middleEntity.Components.Add(new Component { MiddleEntity = middleEntity, Value = 1 });
+ var te = new TopEntity
+ {
+ MiddleEntity = middleEntity
+ };
+ session.Save(middleEntity);
+ session.Save(te);
+
+ transaction.Commit();
+ }
+
+ protected override void OnTearDown()
+ {
+ using var session = OpenSession();
+ using var transaction = session.BeginTransaction();
+ session.Delete("from System.Object");
+
+ transaction.Commit();
+ }
+
+ [Test]
+ public async Task ReuseEntityJoinWithCollectionJoinAsync()
+ {
+ using var session = OpenSession();
+
+ var entities = await (session.Query()
+ .Fetch(e => e.MiddleEntity)
+ .Where(e => e.MiddleEntity.Components.Any(e => e.Value != 0))
+ .ToListAsync());
+ Assert.That(entities.Count, Is.EqualTo(1));
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs
new file mode 100644
index 00000000000..0e917134d11
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH3288
+{
+ class TopEntity
+ {
+ public virtual int Id { get; set; }
+ public virtual MiddleEntity MiddleEntity { get; set; }
+ }
+ class MiddleEntity
+ {
+ public virtual int Id { get; set; }
+ public virtual ISet Components { get; set; } = new HashSet();
+ }
+
+ class Component
+ {
+ public virtual MiddleEntity MiddleEntity { get; set; }
+ public virtual int Value { get; set; }
+
+ public override bool Equals(object obj)
+ {
+ return (obj as Component)?.MiddleEntity.Id == MiddleEntity.Id;
+ }
+
+ public override int GetHashCode()
+ {
+ return MiddleEntity.Id.GetHashCode();
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs
new file mode 100644
index 00000000000..440c4f772bd
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs
@@ -0,0 +1,47 @@
+using System.Linq;
+using NHibernate.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3288
+{
+ [TestFixture]
+ public class FetchAndCollectionJoinFixture : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using var session = OpenSession();
+ using var transaction = session.BeginTransaction();
+ var middleEntity = new MiddleEntity();
+ middleEntity.Components.Add(new Component { MiddleEntity = middleEntity, Value = 1 });
+ var te = new TopEntity
+ {
+ MiddleEntity = middleEntity
+ };
+ session.Save(middleEntity);
+ session.Save(te);
+
+ transaction.Commit();
+ }
+
+ protected override void OnTearDown()
+ {
+ using var session = OpenSession();
+ using var transaction = session.BeginTransaction();
+ session.Delete("from System.Object");
+
+ transaction.Commit();
+ }
+
+ [Test]
+ public void ReuseEntityJoinWithCollectionJoin()
+ {
+ using var session = OpenSession();
+
+ var entities = session.Query()
+ .Fetch(e => e.MiddleEntity)
+ .Where(e => e.MiddleEntity.Components.Any(e => e.Value != 0))
+ .ToList();
+ Assert.That(entities.Count, Is.EqualTo(1));
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml
new file mode 100644
index 00000000000..94ca5e12a95
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs
index 2b2423d85bb..0982c4fdaee 100644
--- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs
+++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs
@@ -527,7 +527,7 @@ internal string GetEntitySuffix(FromElement fromElement)
internal string GetCollectionSuffix(FromElement fromElement)
{
- if (!fromElement.CollectionJoin && fromElement.QueryableCollection == null)
+ if (fromElement.QueryableCollection == null)
{
return null;
}