Skip to content

Commit 14964ec

Browse files
committed
fix: Added test for many-2- many query using both sides of the relationship
1 parent 2f503f8 commit 14964ec

File tree

2 files changed

+43
-1
lines changed
  • graphql-jpa-query-example-model-starwars/src/main/java/com/introproventures/graphql/jpa/query/schema/model/starwars
  • graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema

2 files changed

+43
-1
lines changed

graphql-jpa-query-example-model-starwars/src/main/java/com/introproventures/graphql/jpa/query/schema/model/starwars/Character.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import javax.persistence.OrderBy;
3131

3232
import com.introproventures.graphql.jpa.query.annotation.GraphQLDescription;
33+
3334
import lombok.EqualsAndHashCode;
3435
import lombok.Getter;
3536
import lombok.Setter;
@@ -40,7 +41,7 @@
4041
@Getter
4142
@Setter
4243
@ToString
43-
@EqualsAndHashCode(exclude={"appearsIn","friends"}) // Fixes NPE in Hibernate when initializing loaded collections #1
44+
@EqualsAndHashCode(exclude={"appearsIn","friends", "friendsOf"}) // Fixes NPE in Hibernate when initializing loaded collections #1
4445
public abstract class Character {
4546

4647
@Id
@@ -58,6 +59,10 @@ public abstract class Character {
5859
@OrderBy("name ASC")
5960
Set<Character> friends;
6061

62+
@ManyToMany(fetch=FetchType.LAZY, mappedBy = "friends")
63+
@OrderBy("name ASC")
64+
Set<Character> friendsOf;
65+
6166
@GraphQLDescription("What Star Wars episodes does this character appear in")
6267
@ElementCollection(targetClass = Episode.class, fetch=FetchType.LAZY)
6368
@Enumerated(EnumType.ORDINAL)

graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsQueryExecutorTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaExecutor;
4141
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
42+
import com.introproventures.graphql.jpa.query.schema.model.starwars.Character;
43+
import com.introproventures.graphql.jpa.query.schema.model.starwars.Droid;
4244

4345
@RunWith(SpringRunner.class)
4446
@SpringBootTest
@@ -86,6 +88,41 @@ public void JPASampleTester() {
8688
assertThat(result).isNotEmpty();
8789
assertThat(result).hasSize(13);
8890
}
91+
92+
@Test
93+
@Transactional
94+
public void queryManyToManyTester() {
95+
// given:
96+
Query query = em.createQuery("select distinct droid from Droid as droid "
97+
+ "left join fetch droid.friends as generatedAlias0 "
98+
+ "inner join fetch generatedAlias0.friendsOf as generatedAlias1 "
99+
+ "where generatedAlias1.name='Luke Skywalker' "
100+
+ "order by droid.id asc");
101+
102+
query.setHint("hibernate.query.passDistinctThrough", false);
103+
104+
// when:
105+
List<Droid> result = query.getResultList();
106+
107+
// then:
108+
assertThat(result).hasSize(2);
109+
110+
assertThat(result.get(0).getName()).isEqualTo("C-3PO");
111+
assertThat(result.get(0).getFriends()).hasSize(3);
112+
assertThat(result.get(0).getFriends()).extracting(Character::getName)
113+
.containsOnly("Han Solo", "Leia Organa", "R2-D2");
114+
assertThat(result.get(0).getFriends()).flatExtracting(Character::getFriendsOf)
115+
.extracting(Character::getName)
116+
.containsOnly("Luke Skywalker");
117+
118+
assertThat(result.get(1).getName()).isEqualTo("R2-D2");
119+
assertThat(result.get(1).getFriends()).hasSize(2);
120+
assertThat(result.get(1).getFriends()).extracting(Character::getName)
121+
.containsOnly("Han Solo", "Leia Organa");
122+
assertThat(result.get(1).getFriends()).flatExtracting(Character::getFriendsOf)
123+
.extracting(Character::getName)
124+
.containsOnly("Luke Skywalker");
125+
}
89126

90127
@Test
91128
public void getsNamesOfAllDroids() {

0 commit comments

Comments
 (0)