QuickJava-ORMQuickJava-ORM
首页
快速安装
关于我们
首页
快速安装
关于我们
  • 开始

    • 快速安装
    • 手动安装
    • 兼容性
    • 版本对应关系
  • 模型定义

    • 定义模型
    • 常见问题
  • 构造器/Wrapper

    • 查询
    • 关联查询
    • 增加
    • 修改
    • 删除
    • 逻辑删除
    • 常见问题
  • 其他
    • 关于我们
    • 性能基准
    • Gitee
    • Github

构造器查询(ModelWrapper)

ModelWrapper 是 quickjava-orm 的核心查询构造器,提供类型安全的 Lambda 链式调用 API。

创建 Wrapper

lambda 方式

ModelWrapper.lambda(User.class)

带别名

ModelWrapper.lambda(User.class, "u")
ModelWrapper.of(User.class, "u")

of 方式

ModelWrapper.of(User.class)

指定返回值类型

ModelResultWrapper.lambda(User.class, UserVO.class)

条件查询

等值条件

// eq - 等于
wrapper.eq(User::getId, 1)
wrapper.eq(User::getStatus, "0")

// neq - 不等于
wrapper.neq(User::getId, 0)
wrapper.neq(User::getStatus, "1")

比较条件

// 大于 / 大于等于
wrapper.gt(User::getTenantId, 0)
wrapper.gte(User::getTenantId, 1)

// 小于 / 小于等于
wrapper.lt(User::getId, 1000)
wrapper.lte(User::getId, 999)

模糊匹配

wrapper.like(User::getNickName, "%admin%")
wrapper.notLike(User::getNickName, "%test%")
wrapper.likeLeft(User::getNickName, "admin")    // LIKE '%admin'
wrapper.likeRight(User::getNickName, "admin")   // LIKE 'admin%'

范围条件

wrapper.in(User::getId, 1, 2, 3)
wrapper.notIn(User::getId, 999, 1000)

wrapper.between(AllTypeEntity::getId, 1, 100)
wrapper.notBetween(AllTypeEntity::getId, -1, 0)

空值判断

wrapper.isNull(User::getLoginIp)
wrapper.isNotNull(User::getLoginIp)

条件开关(带 boolean)

boolean enabled = true;
wrapper.eq(enabled, User::getStatus, "0")       // enabled=true 时生效
wrapper.eq(!enabled, User::getId, 99999)        // enabled=false 时跳过
wrapper.neq(enabled, User::getId, 0)
wrapper.gt(enabled, User::getTenantId, 0)
wrapper.like(enabled, User::getNickName, "%admin%")
wrapper.in(enabled, User::getId, 1, 2, 3)

条件组合(AND / OR)

简单 AND

wrapper.and(w -> w
    .eq(User::getStatus, "0")
    .neq(User::getId, 0)
    .gt(User::getTenantId, 0)
)

简单 OR

wrapper.or(w -> w
    .eq(User::getId, 1)
    .eq(User::getId, 2)
    .eq(User::getId, 3)
)

多层嵌套

wrapper
    .and(w -> w
        .eq(User::getStatus, "0")
        .or(w2 -> w2
            .eq(User::getId, 1)
            .eq(User::getId, 2)
        )
        .or(w3 -> w3
            .eq(User::getId, 3)
            .eq(User::getId, 4)
        )
    )
    .or(w -> w
        .eq(User::getStatus, "1")
        .neq(User::getId, 0)
    )

深层嵌套

wrapper
    .and(w -> w
        .neq(User::getId, 0)
        .neq(User::getStatus, 0)
        .or(o -> o
            .eq(User::getId, 1)
            .eq(User::getId, 2)
            .and(a -> a
                .neq(User::getStatus, "1")
                .neq(User::getSex, "0")
            )
        )
    )

字段选择

选择指定字段

wrapper.field(User::getId, User::getNickName, User::getEmail)

选择全部字段

wrapper.field(User.class)

混合选择

wrapper
    .field(User::getId, User::getNickName)
    .field(User.class)

排序

升序 / 降序

wrapper.order(User::getCreateTime)           // ASC
wrapper.order(User::getCreateTime, false)    // DESC

多字段排序

wrapper
    .order(User::getStatus)                  // ASC
    .order(User::getCreateTime, false)       // DESC
    .orderByAsc(User::getId)
    .orderByDesc(User::getTenantId)

分组聚合

分组

wrapper.group(User::getStatus)               // 单字段
wrapper.group(User::getStatus, User::getSex) // 多字段

Having

wrapper
    .group(AllTypeEntity::getIntVal)
    .having(AllTypeEntity::getIntVal)

分页

page + pagination

IPagination<User> page = wrapper
    .page(1, 10)
    .pagination();

直接 pagination

wrapper.pagination()           // 默认 1, 20
wrapper.pagination(1)          // 第 1 页
wrapper.pagination(1, 10)      // 第 1 页,每页 10 条
wrapper.pagination(1L, 10L)    // Long 版本

获取分页数据

IPagination<User> page = wrapper.pagination(1, 10);
long total = page.getTotal();         // 总记录数
long pages = page.getPages();         // 总页数
long current = page.getPage();        // 当前页码
long size = page.getPageSize();       // 每页条数
List<User> rows = page.getRows();     // 数据行

Limit 限制

wrapper.limit(10)          // 前 10 条
wrapper.limit(0, 5)        // offset 0, limit 5

执行查询

查询单条

User user = wrapper
    .eq(User::getId, 1)
    .find();
// 结果不存在返回 null

查询列表

List<User> list = wrapper
    .eq(User::getStatus, "0")
    .select();
// 结果不存在返回空 List

数据操作

插入

// 通过 ModelWrapper.create
Long id = ModelWrapper.create(entity);

// 通过 insertGetId
Long id = wrapper.insertGetId(entity);

// 通过 Map 数据
Map<String, Object> data = new LinkedHashMap<>();
data.put("int_val", 777);
data.put("string_val", "test");
Long id = wrapper.data(data).insertGetId();

// 批量插入
int rows = wrapper.insertAll(Arrays.asList(e1, e2));

更新

// 更新单个字段
wrapper
    .eq(AllTypeEntity::getIntVal, 999)
    .update(AllTypeEntity::getStringVal, "updated");

// 通过 Map 更新
Map<String, Object> data = new LinkedHashMap<>();
data.put("string_val", "updated");
wrapper
    .eq(AllTypeEntity::getIntVal, 888)
    .update(data);

删除

wrapper
    .eq(AllTypeEntity::getId, id)
    .delete();

Save(自动判断 insert/update)

// 主键不存在则 insert,存在则 update
int rows = wrapper.save(entity);

其他功能

Soft Delete

// 默认 @ModelLogic 注解的模型会自动过滤已删除记录
// 如需包含已删除:
wrapper.includeSoftDelete()

Union

wrapper
    .union("SELECT * FROM other_table")

Distinct

wrapper.distinct(true)

Lock

wrapper.lock(true)    // SELECT ... FOR UPDATE

where 简写

wrapper.where(User::getId, 1)
wrapper.where(User::getId, Operator.GT, 0)

完整示例

@RunWith(TestRunner.class)
public class UserTest {

    @Test
    public void testQuery() {
        List<User> list = ModelWrapper.lambda(User.class)
            .eq(User::getStatus, "0")
            .neq(User::getId, 0)
            .like(User::getNickName, "%admin%")
            .in(User::getId, 1, 2, 3)
            .between(User::getCreateTime, startDate, endDate)
            .orderByDesc(User::getId)
            .page(1, 10)
            .select();
    }

    @Test
    public void testInsert() {
        User user = new User();
        user.setUserName("test");
        user.setNickName("测试");
        user.setStatus("0");
        Long id = ModelWrapper.create(user);
    }

    @Test
    public void testUpdate() {
        ModelWrapper.lambda(User.class)
            .eq(User::getId, 1)
            .update(User::getNickName, "新昵称");
    }

    @Test
    public void testDelete() {
        ModelWrapper.lambda(User.class)
            .eq(User::getId, 1)
            .delete();
    }
}
Last Updated:
Contributors: qlopc-msi, qlopc-tbk@zocell.com
Next
关联查询