【问题标题】:Result from query with join loses order when converted to POJO list转换为 POJO 列表时,带有连接的查询的结果会丢失顺序
【发布时间】:2019-11-25 05:58:28
【问题描述】:

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

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

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

如果我遗漏了一些关键细节,请告诉我,我会补充。

【问题讨论】:

  • 如果你想在 Map 中保留插入顺序,然后去 LinkedHashMap 它将解决你的问题。
  • 1) “由于没有找到使用 jooq sintax 构建它的方法,因此将不胜感激” 您能否展示您完整的 jOOQ 代码和为什么你不能用 jOOQ 实现你想要的? 2)、为什么要区分TaskTaskQuery?它们有何不同? 3) 完整的查询是什么样的?
  • @LukasEder 抱歉,那些 TaskQuery 是错字,我将它们更改为“Task”。关于完整的 jooq,这是一个很长的查询,但 sql 输出是预期的,所以我认为它工作得很好。
  • 如果不了解您想要通过ORDER BY 子句实现的确切,真的很难为您提供帮助。对我来说,它看起来不像你认为它正在做的事情,即使在 SQL 中也是如此。或者,您发布的内容不完整。

标签: java oracle sql-order-by jooq


【解决方案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]

【讨论】:

  • 所以我想必须使用一些 Comparator 实现来订购结果地图。 jooq 没有其他方法可以解决这个问题,对吧?
  • @Migerusantte:我想我们这里有一个XYProblem 的经典案例。你问的是 Y(一些预计的 jOOQ 问题),但我认为你真正的问题是 X(错误的 SQL,或错误的 jOOQ API 使用)。在您解释了您真正想要实现的目标(最好是一些示例数据)以及您当前的查询是什么之前,我不确定如何为您提供帮助。
  • 好吧,老实说,你对这个回复的解释正是它发生的情况,但是我不能在这里发布完整的代码,因为它太长了,我们会到同一点。我想我理解了这个问题,并将生成的地图条目排序到一个有序列表中。谢谢。
猜你喜欢
  • 2016-09-15
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多