未发布版本 v6.3.0-SNAPSHOT。 本页内容来自 alpha 分支,随时可能变更,不属于任何已发布版本。

commit 49619c6 · 注入于 2026-09-13 12:21 UTC

Skip to content

流式查询 DSL

自 v6.2.0 起

流式查询 DSL 自 UltiTools-API v6.2.0 起可用。

UltiTools 提供了一套流式查询 DSL,让你可以使用可读性强的链式 API 来构建数据查询。无需手动构建 WhereCondition 对象,你可以直接编写表达力更强的查询语句。

基本用法

从任意 DataOperator 获取 Query 构建器:

java
DataOperator<HomeEntity> dataOperator = plugin.getDataOperator(HomeEntity.class);

// 查找某个玩家的所有家
List<HomeEntity> homes = dataOperator.query()
    .where("player_id").eq(playerUuid)
    .list();

条件

where / and

使用 where() 开始第一个条件,使用 and() 添加额外条件:

java
// 根据玩家和名称查找特定的家
HomeEntity home = dataOperator.query()
    .where("player_id").eq(playerUuid)
    .and("name").eq("base")
    .first();

比较运算符

在调用 where()and() 之后,链接以下运算符之一:

运算符说明示例
eq(value)等于.where("name").eq("base")
ne(value)不等于.where("status").ne("disabled")
gt(value)大于.where("level").gt(10)
lt(value)小于.where("balance").lt(1000.0)
gte(value)大于等于.where("level").gte(5)
lte(value)小于等于.where("balance").lte(500.0)
like(pattern)SQL LIKE 模式匹配.where("name").like("%base%")
in(collection)值在集合中.where("world").in(worldList)
java
// 查找余额在 100 到 1000 之间的玩家
List<PlayerEntity> players = dataOperator.query()
    .where("balance").gte(100.0)
    .and("balance").lte(1000.0)
    .list();

// 查找特定世界中的家
List<String> worlds = Arrays.asList("world", "world_nether");
List<HomeEntity> homes = dataOperator.query()
    .where("world").in(worlds)
    .list();

排序

使用 orderBy()(升序)或 orderByDesc()(降序)对结果排序:

java
// 按余额降序获取玩家
List<PlayerEntity> richest = dataOperator.query()
    .orderByDesc("balance")
    .list();

// 按等级升序排序
List<PlayerEntity> sorted = dataOperator.query()
    .orderBy("level")
    .list();

分页

使用 limit()offset() 进行分页:

java
// 获取第 2 页,每页 10 条
int pageSize = 10;
int page = 2;
List<PlayerEntity> pageResults = dataOperator.query()
    .limit(pageSize)
    .offset((page - 1) * pageSize)
    .list();

终端操作

每个查询链必须以终端操作结束:

方法返回类型说明
list()List<T>返回所有匹配结果
first()T(可为null)返回第一个匹配结果,无匹配则返回 null
exists()boolean存在匹配结果则返回 true
count()long统计匹配结果数量
delete()int删除匹配结果,返回删除数量
java
// 检查玩家是否有家
boolean hasHomes = dataOperator.query()
    .where("player_id").eq(playerUuid)
    .exists();

// 统计玩家的家数量
long homeCount = dataOperator.query()
    .where("player_id").eq(playerUuid)
    .count();

// 删除特定世界的所有家
int deleted = dataOperator.query()
    .where("world").eq("old_world")
    .delete();

完整示例

以下是使用查询 DSL 的完整服务示例:

java
package com.ultikits.docs.query;

import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.abstracts.data.AuditableDataEntity;
import com.ultikits.ultitools.abstracts.data.BaseDataEntity;
import com.ultikits.ultitools.annotations.*;
import com.ultikits.ultitools.interfaces.DataOperator;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.bukkit.entity.Player;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class HomeServiceImpl implements HomeService {

    private final UltiToolsPlugin plugin;

    @Autowired
    public HomeServiceImpl(UltiToolsPlugin plugin) {
        this.plugin = plugin;
    }

    @Override
    public HomeEntity getHome(String playerUuid, String homeName) {
        return plugin.getDataOperator(HomeEntity.class).query()
            .where("player_id").eq(playerUuid)
            .and("name").eq(homeName)
            .first();
    }

    @Override
    public List<HomeEntity> getAllHomes(String playerUuid) {
        return plugin.getDataOperator(HomeEntity.class).query()
            .where("player_id").eq(playerUuid)
            .orderBy("name")
            .list();
    }

    @Override
    public boolean homeExists(String playerUuid, String homeName) {
        return plugin.getDataOperator(HomeEntity.class).query()
            .where("player_id").eq(playerUuid)
            .and("name").eq(homeName)
            .exists();
    }

    @Override
    public void deleteHome(String playerUuid, String homeName) {
        plugin.getDataOperator(HomeEntity.class).query()
            .where("player_id").eq(playerUuid)
            .and("name").eq(homeName)
            .delete();
    }
}

旧版 API

WhereCondition API 仍然可用且未被弃用。查询 DSL 是一个更高级的替代方案,对于复杂查询可读性更好。你可以自由混合使用两种方式。

贡献者

暂无相关贡献者

基于 MIT 许可发布