You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Quarkus应用中读取GraphQL查询结果

解答

一、查询结果的默认存储情况

默认情况下,这个JSON结果不会自动持久化存储。它是Quarkus集成的SmallRye GraphQL框架,在运行时将Java业务对象(Film、Hero实例)序列化成JSON后,通过HTTP响应返回给GraphQL UI的临时数据,不会保存到磁盘、数据库或其他持久化介质中,除非你主动添加存储逻辑。

二、在程序中获取/处理结果的方式

1. 直接获取服务端的原始Java对象(无需序列化)

返回的JSON是从Java对象序列化而来的,你可以在GraphQL方法中直接拿到原始业务对象,包括关联的heroes数据(SmallRye GraphQL会自动触发@Source标记的heroes方法加载关联数据)。

示例:在getFilm方法中直接操作对象

@Query("getFilm")
@Description("Get a film by it's id")
public Film getFilm(@Name("filmId") int id)
{
    Film film = service.getFilm(id);
    // 直接操作film对象,比如打印关联英雄数量
    System.out.println("关联英雄数量:" + film.heroes.size());
    return film;
}

2. 将Java对象序列化为JSON字符串

Quarkus自带JSON-B(默认)或Jackson作为序列化工具,你可以将对象转成和UI展示一致的JSON字符串,用于打印、存储等处理。

示例代码(使用JSON-B):

import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;

@Query("getFilm")
@Description("Get a film by it's id")
public Film getFilm(@Name("filmId") int id)
{
    Film film = service.getFilm(id);
    
    // 将film对象(含关联heroes)序列化为JSON字符串
    try (Jsonb jsonb = JsonbBuilder.create()) {
        String jsonResult = jsonb.toJson(film);
        // 处理JSON字符串:打印、存储等
        System.out.println("查询结果JSON:" + jsonResult);
    }
    
    return film;
}

三、持久化存储并读取结果的方案

如果需要长期保存查询结果,可选择以下两种常见方式:

1. 存储到数据库

定义用于保存查询结果的JPA实体:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import java.time.LocalDateTime;

@Entity
public class StoredGraphQLResult {
    @Id
    private String queryKey; // 用查询标识作为主键,比如"getFilmHeroes_1"
    private String jsonData; // 存储JSON字符串
    private LocalDateTime storeTime; // 存储时间

    public StoredGraphQLResult() {}
    public StoredGraphQLResult(String queryKey, String jsonData) {
        this.queryKey = queryKey;
        this.jsonData = jsonData;
        this.storeTime = LocalDateTime.now();
    }

    // 省略getter和setter方法
}

在GraphQL方法中保存结果:

import jakarta.persistence.EntityManager;
import jakarta.inject.Inject;

@GraphQLApi
public class FilmResources {
    @Inject
    GalaxyService service;
    @Inject
    EntityManager em;

    @Query("getFilm")
    @Description("Get a film by it's id")
    public Film getFilm(@Name("filmId") int id)
    {
        Film film = service.getFilm(id);
        String queryKey = "getFilmHeroes_" + id;
        
        try (Jsonb jsonb = JsonbBuilder.create()) {
            String jsonResult = jsonb.toJson(film);
            // 保存到数据库
            em.persist(new StoredGraphQLResult(queryKey, jsonResult));
        }
        
        return film;
    }
}

读取存储的结果:

// 注入EntityManager后执行查询
StoredGraphQLResult storedResult = em.find(StoredGraphQLResult.class, "getFilmHeroes_1");
if (storedResult != null) {
    String jsonData = storedResult.getJsonData();
    // 将JSON转回Film对象
    try (Jsonb jsonb = JsonbBuilder.create()) {
        Film film = jsonb.fromJson(jsonData, Film.class);
        // 使用film对象
    }
}

2. 存储到本地文件

直接将JSON字符串写入文件:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

@Query("getFilm")
@Description("Get a film by it's id")
public Film getFilm(@Name("filmId") int id)
{
    Film film = service.getFilm(id);
    
    try (Jsonb jsonb = JsonbBuilder.create()) {
        String jsonResult = jsonb.toJson(film);
        // 写入本地文件
        Files.writeString(Paths.get("film-result-" + id + ".json"), 
                          jsonResult, 
                          StandardOpenOption.CREATE, 
                          StandardOpenOption.TRUNCATE_EXISTING);
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    return film;
}

读取文件中的结果:

import java.nio.file.Files;
import java.nio.file.Paths;

String jsonData = Files.readString(Paths.get("film-result-1.json"));
try (Jsonb jsonb = JsonbBuilder.create()) {
    Film film = jsonb.fromJson(jsonData, Film.class);
    // 使用film对象
} catch (Exception e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者Abdullah Chaudhry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:24:22