首页 > 解决方案 > 转换为 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);

此时我的响应变量已经是一个映射,但是顺序丢失了。

没有错误消息或异常,地图按预期返回,但订单丢失。

如果我遗漏了一些关键细节,请告诉我,我会添加它。

标签: javaoraclesql-order-byjooq

解决方案


各种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]

推荐阅读