Skip to content

Commit 05ca9a8

Browse files
committed
Fixed Hibernate NPE and cannot load multiple bags in one query exception
This closes #1, closes #2
1 parent 509f5d2 commit 05ca9a8

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,37 @@ public void queryDeepNesting() {
215215

216216

217217
String expected = "{Droid={name=R2-D2, friends=["
218-
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Han Solo}, {name=Leia Organa}, {name=C-3PO}, {name=R2-D2}]}, "
219-
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Luke Skywalker}, {name=Leia Organa}, {name=R2-D2}]}, "
220-
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Luke Skywalker}, {name=Han Solo}, {name=C-3PO}, {name=R2-D2}]}"
218+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=R2-D2}, {name=Han Solo}, {name=Luke Skywalker}]}, "
219+
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=Leia Organa}, {name=R2-D2}, {name=Luke Skywalker}]}, "
220+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=Leia Organa}, {name=R2-D2}, {name=Han Solo}]}"
221221
+ "]}}";
222+
223+
//when:
224+
Object result = executor.execute(query).getData();
222225

226+
//then:
227+
assertThat(result.toString()).isEqualTo(expected);
228+
}
229+
230+
// Cannot simultaneously fetch multiple bags #2
231+
@Test
232+
public void queryDeepNestingPlural() {
233+
//given:
234+
String query = "query { Droids(where: {id: {EQ: \"2001\"}}) { select { name, friends { name, appearsIn, friends { name } } } }}";
235+
236+
String expected = "{Droids={select=[{name=R2-D2, friends=["
237+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=R2-D2}, {name=Han Solo}, {name=Luke Skywalker}]}, "
238+
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=R2-D2}, {name=Leia Organa}, {name=Luke Skywalker}]}, "
239+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS], friends=[{name=C-3PO}, {name=R2-D2}, {name=Leia Organa}, {name=Han Solo}]}]}"
240+
+ "]}}";
241+
223242
//when:
224243
Object result = executor.execute(query).getData();
225244

226245
//then:
227246
assertThat(result.toString()).isEqualTo(expected);
228247
}
248+
229249

230250
@Test
231251
public void queryWhereRoot() {
@@ -280,11 +300,12 @@ public void queryByCollectionOfEnumsAtRootLevel() {
280300
//given:
281301
String query = "query { Humans ( where: { appearsIn: {IN: [THE_FORCE_AWAKENS]}}) { select { name appearsIn } } }";
282302

303+
283304
String expected = "{Humans={select=["
284-
+ "{name=Luke Skywalker, appearsIn=[EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS, A_NEW_HOPE]}, "
305+
+ "{name=Luke Skywalker, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, "
285306
+ "{name=Han Solo, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}, "
286-
+ "{name=Leia Organa, appearsIn=[RETURN_OF_THE_JEDI, EMPIRE_STRIKES_BACK, A_NEW_HOPE, THE_FORCE_AWAKENS]}"
287-
+ "]}}";
307+
+ "{name=Leia Organa, appearsIn=[A_NEW_HOPE, EMPIRE_STRIKES_BACK, RETURN_OF_THE_JEDI, THE_FORCE_AWAKENS]}"
308+
+ "]}}";
288309

289310
//when:
290311
Object result = executor.execute(query).getData();

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package com.introproventures.graphql.jpa.query.schema.model.starwars;
1818

19-
import java.util.Collection;
19+
import java.util.Set;
2020

2121
import javax.persistence.ElementCollection;
2222
import javax.persistence.Entity;
@@ -26,14 +26,21 @@
2626
import javax.persistence.JoinColumn;
2727
import javax.persistence.JoinTable;
2828
import javax.persistence.ManyToMany;
29+
import javax.persistence.OrderBy;
2930

3031
import com.introproventures.graphql.jpa.query.annotation.GraphQLDescription;
3132

32-
import lombok.Data;
33+
import lombok.EqualsAndHashCode;
34+
import lombok.Getter;
35+
import lombok.Setter;
36+
import lombok.ToString;
3337

3438
@Entity
3539
@GraphQLDescription("Abstract representation of an entity in the Star Wars Universe")
36-
@Data
40+
@Getter
41+
@Setter
42+
@ToString
43+
@EqualsAndHashCode(exclude={"appearsIn","friends"}) // Fixes NPE in Hibernate when initializing loaded collections #1
3744
public abstract class Character {
3845

3946
@Id
@@ -48,11 +55,14 @@ public abstract class Character {
4855
@JoinTable(name="character_friends",
4956
joinColumns=@JoinColumn(name="source_id", referencedColumnName="id"),
5057
inverseJoinColumns=@JoinColumn(name="friend_id", referencedColumnName="id"))
51-
Collection<Character> friends;
58+
Set<Character> friends;
5259

5360
@GraphQLDescription("What Star Wars episodes does this character appear in")
5461
@ElementCollection(targetClass = Episode.class)
5562
@Enumerated(EnumType.ORDINAL)
56-
Collection<Episode> appearsIn;
63+
@OrderBy
64+
Set<Episode> appearsIn;
65+
66+
Character() {}
5767

5868
}

0 commit comments

Comments
 (0)