Linq.J Where条件查询:灵活过滤数据技巧
还在为Java集合数据过滤而烦恼?面对复杂的业务筛选需求,传统的for循环和if判断让代码变得冗长难维护?Linq.J的Where条件查询功能为你提供了一套优雅、强大的数据过滤解决方案,让数据处理变得简单高效!
读完本文,你将掌握:
- ✅ 15种Where条件查询方法的完整用法
- ✅ 复杂业务场景下的条件组合技巧
- ✅ 空值处理和边界条件的优雅解决方案
- ✅ 性能优化和最佳实践指南
一、Where条件查询基础入门
Linq.J是基于JVM Lambda特性的对象查询语言(LINQ)库,提供了类似C# LINQ的流畅API。Where条件查询是其核心功能之一,支持丰富的条件判断操作。
1.1 项目依赖配置
首先确保在pom.xml中添加Linq.J依赖:
<dependency>
<groupId>xyz.erupt</groupId>
<artifactId>linq</artifactId>
<version>最新版本</version>
</dependency>
1.2 基础数据模型
让我们定义一个测试数据模型作为示例:
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
private Date createTime;
private Boolean active;
// 构造方法、getter、setter省略
}
二、15种Where条件方法详解
Linq.J提供了丰富的条件查询方法,覆盖了绝大多数业务场景的需求。
2.1 相等性判断
// 等于查询
List<User> users = Linq.from(userList)
.eq(User::getName, "张三")
.write(User.class);
// 不等于查询
List<User> users = Linq.from(userList)
.ne(User::getName, "李四")
.write(User.class);
2.2 数值比较查询
// 大于查询
List<User> users = Linq.from(userList)
.gt(User::getAge, 18)
.write(User.class);
// 小于查询
List<User> users = Linq.from(userList)
.lt(User::getAge, 60)
.write(User.class);
// 大于等于查询
List<User> users = Linq.from(userList)
.gte(User::getAge, 20)
.write(User.class);
// 小于等于查询
List<User> users = Linq.from(userList)
.lte(User::getAge, 30)
.write(User.class);
// 区间查询
List<User> users = Linq.from(userList)
.between(User::getAge, 20, 30)
.write(User.class);
2.3 集合操作查询
// IN查询 - 数组形式
List<User> users = Linq.from(userList)
.in(User::getName, "张三", "李四", "王五")
.write(User.class);
// IN查询 - 列表形式
List<String> names = Arrays.asList("张三", "李四", "王五");
List<User> users = Linq.from(userList)
.in(User::getName, names)
.write(User.class);
// NOT IN查询
List<User> users = Linq.from(userList)
.notIn(User::getName, "张三", "李四")
.write(User.class);
2.4 字符串模糊查询
// 模糊查询(包含)
List<User> users = Linq.from(userList)
.like(User::getEmail, "@gmail.com")
.write(User.class);
2.5 空值处理查询
// 空值判断
List<User> users = Linq.from(userList)
.isNull(User::getEmail)
.write(User.class);
// 非空判断
List<User> users = Linq.from(userList)
.isNotNull(User::getEmail)
.write(User.class);
// 空字符串判断
List<User> users = Linq.from(userList)
.isBlank(User::getName)
.write(User.class);
// 非空字符串判断
List<User> users = Linq.from(userList)
.isNotBlank(User::getName)
.write(User.class);
三、复杂条件组合技巧
在实际业务中,往往需要组合多个条件进行复杂查询。
3.1 多条件AND组合
// 多条件AND查询:年龄20-30且状态为激活的用户
List<User> users = Linq.from(userList)
.gte(User::getAge, 20)
.lte(User::getAge, 30)
.eq(User::getActive, true)
.write(User.class);
3.2 自定义复杂条件
// 使用where方法实现复杂自定义条件
List<User> users = Linq.from(userList)
.where(user -> {
Integer age = user.getAge();
String email = user.getEmail();
return age != null && age >= 25 &&
email != null && email.endsWith("@company.com");
})
.write(User.class);
3.3 OR条件组合
// OR条件查询:名字为张三或李四的用户
List<User> users = Linq.from(userList)
.where(user -> {
String name = user.getName();
return "张三".equals(name) || "李四".equals(name);
})
.write(User.class);
四、实战案例:用户管理系统查询
让我们通过一个完整的用户管理系统案例来展示Where查询的实际应用。
4.1 用户搜索功能
public List<User> searchUsers(UserSearchCriteria criteria) {
Linq<User> query = Linq.from(userList);
if (criteria.getName() != null) {
query = query.like(User::getName, criteria.getName());
}
if (criteria.getMinAge() != null) {
query = query.gte(User::getAge, criteria.getMinAge());
}
if (criteria.getMaxAge() != null) {
query = query.lte(User::getAge, criteria.getMaxAge());
}
if (criteria.getEmailDomain() != null) {
query = query.like(User::getEmail, "@" + criteria.getEmailDomain());
}
if (criteria.getActive() != null) {
query = query.eq(User::getActive, criteria.getActive());
}
return query.write(User.class);
}
4.2 数据统计报表
public UserStatistics getUserStatistics() {
UserStatistics stats = new UserStatistics();
// 活跃用户数
stats.setActiveUsers(Linq.from(userList)
.eq(User::getActive, true)
.select(Columns.count("count"))
.writeOne(Integer.class));
// 成年用户数
stats.setAdultUsers(Linq.from(userList)
.gte(User::getAge, 18)
.select(Columns.count("count"))
.writeOne(Integer.class));
// 企业邮箱用户数
stats.setCorporateUsers(Linq.from(userList)
.like(User::getEmail, "@company.com")
.select(Columns.count("count"))
.writeOne(Integer.class));
return stats;
}
五、性能优化与最佳实践
5.1 查询性能优化
5.2 最佳实践指南
- 链式调用顺序:将过滤性强的条件放在前面,减少后续处理的数据量
- 避免重复查询:对同一数据集的多次查询应考虑缓存中间结果
- 空值安全:始终考虑字段可能为null的情况,使用安全访问方法
- 类型安全:利用Lambda表达式确保编译期类型检查
5.3 常见陷阱与解决方案
// 错误示例:可能抛出NPE
List<User> users = Linq.from(userList)
.eq(User::getAge, 25) // age可能为null
.write(User.class);
// 正确示例:空值安全处理
List<User> users = Linq.from(userList)
.where(user -> user.getAge() != null && user.getAge() == 25)
.write(User.class);
六、与其他查询操作组合使用
Where条件查询可以与其他Linq.J操作无缝组合,构建复杂的查询管道。
6.1 与Select组合
// 查询并投影
List<String> names = Linq.from(userList)
.gte(User::getAge, 18)
.select(User::getName)
.write(String.class);
6.2 与OrderBy组合
// 查询并排序
List<User> users = Linq.from(userList)
.eq(User::getActive, true)
.orderBy(User::getAge)
.write(User.class);
6.3 与GroupBy组合
// 分组统计
List<Map<String, Object>> stats = Linq.from(userList)
.gte(User::getAge, 18)
.groupBy(User::getActive)
.select(Columns.count("count"))
.writeMap();
七、总结与展望
Linq.J的Where条件查询功能为Java开发者提供了强大而灵活的数据过滤能力。通过15种内置条件方法和自定义条件支持,几乎可以满足所有业务场景的查询需求。
核心优势:
- 🚀 流畅的API设计,代码可读性极佳
- 🔧 丰富的条件操作,覆盖常见业务场景
- 🛡️ 类型安全,编译期错误检查
- ⚡ 高性能,延迟执行优化
适用场景:
- 业务系统中的数据筛选和查询
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



