带连接的查询结果转换为POJO列表时失去顺序

时间:2019-07-16 13:20:37

标签: java oracle sql-order-by jooq

我正在使用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);

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

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

请告诉我是否缺少一些关键细节,我将其添加。

1 个答案:

答案 0 :(得分:1)

各种fetchGroups()方法在幕后使用LinkedHashMap,它们会返回给您,并以获取顺序迭代记录,因此您提供给jOOQ查询的任何顺序相对而言都是稳定的这些方法。

根据显示的内容,您正在按一些V列进行排序,这些列可能代表Variable。尽管在客户端中按Task分组时,您可能无法期望保留该顺序,尽管 per 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]