我正在使用 JOOQ 创建对 Oracle 12 数据库的 native 查询。 当我将结果转换为 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()
}
我正在尝试手动将我的 order 子句“插入”到 select 的末尾(因为没有找到使用 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);
此时我的响应变量已经是一个 map ,但顺序丢失了。
没有错误消息或异常, map 按预期返回,但顺序丢失。
请告诉我是否遗漏了一些关键细节,我会添加它。
最佳答案
各种 fetchGroups()
方法在后台使用 LinkedHashMap
,它们将其返回给您,并按获取顺序迭代记录,因此您提供的任何顺序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]
关于java - 带有连接的查询结果在转换为 POJO 列表时会丢失顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57058255/