Spring Boot GraphQL Aliases Query

GraphQL supports Query Operations, Sometimes the requirement is to Query the same field multiple times with different Arguments, GraphQL provides Aliases that support the renaming of Query.

package org.wesome.graphql.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.service.AppleService;

import java.util.List;

@Controller
public class AppleGraphQLController {
    @Autowired
    private AppleService appleService;

    @QueryMapping("findAppleByTaste")
    List<Apple> findAppleById(@Argument String appleTaste) {
        return appleService.findAppleByTaste(appleTaste);
    }

    @QueryMapping("findAllApple")
    List<Apple> findAllApple() {
        return appleService.findAllApple();
    }
}
package org.wesome.graphql.entity;

public record Apple(int appleId, String appleName, String appleTaste) {
}
package org.wesome.graphql.entity;

public enum AppleTaste {
    SWEET("sweet"), TANGY("tangy"), BITTER("bitter"), SOUR("sour");
    private final String appleTaste;

    AppleTaste(String appleTaste) {
        this.appleTaste = appleTaste;
    }
}
package org.wesome.graphql.service;

import org.wesome.graphql.entity.Apple;

import java.util.List;

public interface AppleService {
    List<Apple> findAppleByTaste(String appleTaste);

    List<Apple> findAllApple();
}
package org.wesome.graphql.service;

import com.github.javafaker.Faker;
import org.springframework.stereotype.Service;
import org.wesome.graphql.entity.Apple;
import org.wesome.graphql.entity.AppleTaste;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Service
public class AppleServiceImpl implements AppleService {
    private static List<Apple> apples;

    static {
        Faker faker = new Faker();
        apples = IntStream.rangeClosed(1, 10).mapToObj(value -> new Apple(value, faker.food().fruit(), AppleTaste.values()[faker.random().nextInt(0, 3)].name())).collect(Collectors.toList());
    }

    @Override
    public List<Apple> findAppleByTaste(String appleTaste) {
        return apples.stream().filter(apple -> apple.appleTaste().equalsIgnoreCase(appleTaste)).collect(Collectors.toList());
    }

    @Override
    public List<Apple> findAllApple() {
        return apples;
    }
}
package org.wesome.graphql;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GraphqlProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(GraphqlProjectApplication.class, args);
    }
}

\src\main\resources\graphql\schema.graphqls

# Apple Enumeration
enum AppleTaste {
    SWEET, TANGY, BITTER, SOUR
}
# Apple Object
type Apple{
    # primary key of apple
    appleId:ID!
    # apple Name
    appleName:String
    # apple AppleTaste
    appleTaste:AppleTaste
}
# Apple Query
type Query{
    # query to get all apples
    findAllApple:[Apple]
    # query to get apple by taste
    findAppleByTaste(appleTaste:AppleTaste):[Apple]
}

\src\main\resources\application.properties

spring.graphql.graphiql.enabled=true
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.5</version>
        <relativePath/>
    </parent>
    <groupId>org.wesome</groupId>
    <artifactId>spring-boot-graphql</artifactId>
    <version>0.0.1-snapshot</version>
    <name>spring-boot-graphql</name>
    <description>implementing graphql in spring boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-graphql</artifactId>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java-extended-scalars</artifactId>
            <version>21.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webflux</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.graphql</groupId>
            <artifactId>spring-graphql-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

GraphiQL

GraphQL provides an inbuild UserInterface GraphiQL, which can be accessed via http://localhost:8080/graphiql or access GraphQL via Postmanin the query section add the below query

query FindAppleByTaste {
    findAppleBySweetTaste: findAppleByTaste(appleTaste: SWEET) {
        appleId
        appleName
        appleTaste
    }
    findAppleByTangyTaste: findAppleByTaste(appleTaste: TANGY) {
        appleId
        appleName
        appleTaste
    }
}

follow us on