【问题标题】:On using graphql-java with spring boot I am unable to query data within nested Lists在 spring boot 中使用 graphql-java 我无法在嵌套列表中查询数据
【发布时间】:2020-01-08 12:12:04
【问题描述】:

我刚开始探索 graphql,所以在使用该框架时遇到了最初的问题。这篇文章中使用的代码托管在 github @https://github.com/samshers/graphQL-Starter
我的 api 的 graphql 架构如下:

schema {
 query: Query
}

type Query {
 allCities: [City]
 city(name: String): City
 state(name: String): State 
}

type City {
    name: String
    population: String
    state: State
}

type State {
    name: String
    population: String
    country: Country
    cities : [City]
} 

type Country {
    name: String
    population: String
}

我要执行的查询是 -

{
  city(name: "BayArea") {
    name
    population
    state {
        name
        population
        cities  {
            name
        }
        country {
            name
            population
        }
    }
  }
}

我得到的结果是 -

{
    "errors": [],
    "data": {
        "city": {
            "name": "BayArea",
            "population": "7200000",
            "state": {
                "name": "CA",
                "population": "39900000",
                "cities": [],
                "country": {
                    "name": "USA",
                    "population": "330000000"
                }
            }
        }
    },
    "extensions": null
}

问题在于这部分结果 -

“人口”:“39900000”,
“城市”:[],
“国家”:{

我确实希望城市数组会相应地填充特定州的所有可用城市。
如果有人能指出问题是否与架构/查询或 jpa 映射有关,将不胜感激。如前所述,代码托管在 github @https://github.com/samshers/graphQL-Starter

【问题讨论】:

  • 我看到您使用的是古代版本的 graphql-java-tools 及其 Spring Boot starter。这些工件的命名完全是一团糟……但新版本位于com.graphql-java-kickstart group id 下,因此您应该改用它们。请注意,Kickstarter 项目独立于 graphql-java(核心 Java 库)团队,以及他们自己的 Spring Boot starter。此外,您标记了 graphql-spqr 但您根本没有使用它。

标签: spring-boot spring-data-jpa graphql graphql-java


【解决方案1】:

迟到总比不回答好。

延迟抓取问题

您的问题来自您的事务管理。这种关系

public class State {

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="state")
    List<City> cities;

被懒惰地获取。仅当访问列表时,JPA 才会填充州的城市列表。如果访问列表时没有事务在运行,则列表将保持为空。

州数据获取器stateRepository.findOne(stateName); 找到州对象,但不填充其城市。后来,当 graphql-java 框架尝试访问城市时,没有事务在运行。因此,城市列表保持为空。

如何解决

简单而肮脏的方法是强制 EAGER 获取:

public class State {

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name="state")
    List<City> cities;

其他更好的解决方案包括告诉 graphql-java-tools 保持事务打开,直到响应被发回并且在这个问题的接受答案中描述:LazyInitializationException with graphql-spring

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多