java - 带有连接的查询结果在转换为 POJO 列表时会丢失顺序

标签 java oracle sql-order-by jooq

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

相关文章:

sql - 如何使用sql查询将数据库的子集提取到dbunit文件中?

mysql - 按记录中的最后一个字母排序列

mysql - Order By SQL request by time range period,然后是其他条件

java - Tomcat 应用程序不会通过 OSX 上的 intellij 进入调试

oracle - 为什么调度器链步骤名的最大长度是 24 个字节?

java - 如何以编程方式读取 JavaDoc,以便可以在 Web 服务中公开它

sql - Oracle Apex 饼图 SQL 语句

sql - CASE 子句上的 ORDER BY 可以更快吗?

java - Maven 给出错误 : try-with-resources is not supported in -source 1. 5

java - 如何将事件与微调器选择相关联