java - 转换为 POJO 列表时,带有连接的查询的结果会丢失顺序
问题描述
我正在使用 JOOQ 创建对 Oracle 12 数据库的本机查询。当我将结果转换为我的 POJO 时,order by 子句中的订单丢失了。
基本上我要加入两个表,任务和变量。一个任务可以有很多变量。
我以这种方式将结果转换为我的 POJO:
select.fetchGroups(Task.class, Variable.class);
public class Task{
private String id;
private String name;
private String formKey;
private List<Variable> variables = new ArrayList<Variable>();
getters()/setters()
...
hashCode()
...
equals()
}
public class Variable{
private String vId;
private String vName;
private String vValue;
private String vType;
getters()/setters()
...
hashCode()
...
equals()
}
我正在尝试在 select 的末尾手动“插入”我的 order 子句(因为没有找到使用 jooq sintax 构建它的方法,对此的一些见解将不胜感激):
jooq dslcontext
@Autowired
private DSLContext dsl;
填充的列表
Map<Task, List<Variable>> response;
简单的句子顺序。
String orderClause = " case when V.NAME_ = '"+sortColumn+"' then V.TEXT_ end "+sortDirection;
(如果我记录这个的普通 SQL,结果是正确排序的)
SelectSeekStep1<Record, Object> selectOrdered = select.orderBy(DSL.field(orderClause));
response = selectOrdered.fetchGroups(Task.class, Variable.class);
此时我的响应变量已经是一个映射,但是顺序丢失了。
没有错误消息或异常,地图按预期返回,但订单丢失。
如果我遗漏了一些关键细节,请告诉我,我会添加它。
解决方案
各种fetchGroups()
方法在LinkedHashMap
后台使用 a,它们返回给您,并以获取顺序迭代记录,因此您为 jOOQ 查询提供的任何顺序相对于这些方法都是稳定的。
根据您显示的内容,您按一些V
列排序,这可能代表Variable
. 您不可能期望Task
在客户端中进行分组时保留该顺序,尽管每个 Task
. 我会说明的。如果这是您从数据库中获得的(因为您按变量排序):
TASK VARIABLE
1 A
2 B
3 C
1 D
2 E
然后,这些fetchGroups()
方法将产生以下客户端分组:
TASK = 1
VARIABLE = [A, D]
TASK = 2
VARIABLE = [B, E]
TASK = 3
VARIABLE = [C]
推荐阅读
- android - 以编程方式将菜单操作栏图标背景颜色更改为不透明圆圈(不是整个工具栏)
- c++ - 不同的 C/C++ 库相互崩溃;可能干扰 poll() 和 select()?
- python - 在高级功能中访问低级功能选项的清晰方法?
- angular - 在 AngularFire2 中使用 sendEmailVerification 方法时,Firebase 验证电子邮件问题
- node.js - 使用 Mongoose 缓解 MongoDB 注入攻击
- angular - Angular 6:无法从路由解析器获取数据
- python - 使用 PyQt5 循环更新和显示图片
- c# - 密码哈希不匹配
- c# - asp.net中自动回发导致文本更改的空文本框
- c - 如何通过命令行选项调用程序?