Dual<L, R> 是一个通用的泛型工具类
Dual<L, R> 是一个通用的泛型工具类,位于项目的公共基础模块中,用于封装两个不同类型的对象。根据类注释,它的主要用途是作为方法返回值,实现一次返回多个变量,而无需为每次多返回值场景创建新的专用类。
核心概念解释
@Query 注解中的 JPQL 查询 select new com.tianzhen.common.Dual(rsr,r) from RuleSetRuleDo rsr, RuleDo r where rsr.setId=?1 and rsr.ruleId=r.ruleId
可以用一个简单的例子来理解:
简单类比
想象一个图书管理系统,其中:
RuleSetRuleDo
就像是图书分类与图书的关联表RuleDo
就像是实际的图书信息表Dual
就像是一个文件夹,同时装着关联信息和图书详情
代码示例
下面是一个简化的示例,展示这种查询的工作方式:
// 1. 假设我们有两个实体类
class BookCategoryRelation {
private Long id;
private Long categoryId;
private Long bookId;
// getters and setters
}
class Book {
private Long bookId;
private String title;
private String author;
// getters and setters
}
// 2. 一个工具类用于同时封装两种对象
class Pair<A, B> {
private A first;
private B second;
public Pair(A first, B second) {
this.first = first;
this.second = second;
}
// getters and setters
}
// 3. 仓库接口中的查询方法
@Query("select new Pair(bcr, b) from BookCategoryRelation bcr, Book b where bcr.categoryId=?1 and bcr.bookId=b.bookId")
List<Pair<BookCategoryRelation, Book>> findBooksByCategory(Long categoryId);
// 4. 使用示例
List<Pair<BookCategoryRelation, Book>> result = bookRepository.findBooksByCategory(1L);
for (Pair<BookCategoryRelation, Book> pair : result) {
BookCategoryRelation relation = pair.getFirst(); // 获取关联信息
Book book = pair.getSecond(); // 获取图书详情
System.out.println("图书标题: " + book.getTitle());
System.out.println("图书作者: " + book.getAuthor());
}
实际工作原理
在原始代码中,这个查询的工作过程是:
- 参数传递:
?1
对应方法参数setId
,表示要查询的规则集ID - 关联查询:同时查询
RuleSetRuleDo
和RuleDo
两个表 - 条件筛选:
rsr.setId=?1
:筛选出特定规则集的关联记录rsr.ruleId=r.ruleId
:将关联记录与规则记录进行匹配
- 构造结果:使用
new com.tianzhen.common.Dual(rsr,r)
为每对匹配的记录创建一个 Dual 对象 - 返回列表:最终返回这些 Dual 对象的列表
为什么使用这种方式
- 避免多次查询:一次查询就能获取关联关系和具体规则内容,减少数据库交互
- 信息完整性:同时获取关系信息和实体详情,满足业务需求
- 代码简洁:通过 Dual 工具类封装,使用时更加方便和直观
这种模式在需要同时获取关联关系和关联实体详情的场景中非常实用,避免了N+1查询问题,提高了查询效率。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: