Java 使用join查询的结果在转换为POJO列表时失去顺序
我正在使用JOOQ创建对oracle12数据库的本机查询。 当我将结果转换为POJO时,ORDERBY子句中的order将丢失 基本上,我连接了两个表,任务和变量。一个任务可以有许多变量 我通过以下方式将结果转换为我的POJO:Java 使用join查询的结果在转换为POJO列表时失去顺序,java,oracle,sql-order-by,jooq,Java,Oracle,Sql Order By,Jooq,我正在使用JOOQ创建对oracle12数据库的本机查询。 当我将结果转换为POJO时,ORDERBY子句中的order将丢失 基本上,我连接了两个表,任务和变量。一个任务可以有许多变量 我通过以下方式将结果转换为我的POJO: select.fetchGroups(Task.class, Variable.class); public class Task{ private String id; private String name; private Stri
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()
}
已填充的列表
Map<Task, List<Variable>> response;
(如果我记录了此的普通SQL,则结果的顺序正确)
SelectSeekStep1 selectOrdered=select.orderBy(DSL.field(orderClause));
response=selectOrdered.fetchGroups(Task.class,Variable.class);
此时,我的响应变量已经是一个映射,但是顺序丢失了
没有错误消息或异常,映射按预期返回,但顺序丢失
请告诉我是否缺少一些关键的细节,我会添加它。各种
fetchGroups()
方法在幕后使用LinkedHashMap
,它们会返回给您,并按提取顺序迭代记录,因此您提供jOOQ查询的任何顺序对于这些方法都是稳定的
从所显示的内容来看,您是按一些V
列排序的,这些列可能代表Variable
。在客户端中按任务
分组时,您不可能期望保留该顺序,尽管每个任务
的顺序是稳定的。我来举例说明。如果这是您从数据库获得的(因为您是按变量排序的):
然后,这些fetchGroups()
方法将生成以下客户端分组:
TASK = 1
VARIABLE = [A, D]
TASK = 2
VARIABLE = [B, E]
TASK = 3
VARIABLE = [C]
若你们想在Map中保留插入顺序,那个么使用LinkedHashMap将解决你们的问题。1)“因为并没有找到一种方法来用jooq sintax构建它,对此的一些见解将非常感谢”你们能展示你们的commplete jooq代码吗?为什么你们不能用jooq实现你们想要的?2) ,为什么要区分
任务
和任务查询
?它们有何不同?3) 完整的查询是什么样子的?@LukasEder抱歉,那些TaskQuery是一个打字错误,我把它们改成了“Task”。关于完整的jooq,这是一个很长的查询,但sql输出是预期的,因此我认为它工作正常。如果不理解使用该ORDER BY
子句想要实现什么,就很难帮助您。对我来说,它看起来不像是在做你认为它在做的事情,即使是在SQL中。或者,您发布的内容是不完整的。因此,我猜您必须使用一些Comparator实现对结果映射进行排序。没有其他办法和乔奥一起解决这个问题,对吧?@Migerusante:我想我们这里有一个典型的例子。您询问的是Y(一些预计的jOOQ问题),但我认为您真正的问题是X(错误的SQL或错误的jooqapi用法)。我不知道该如何帮助你,直到你解释了你真正想要实现的目标(最好是用一些样本数据),也许,你当前的查询是什么。老实说,你对这个回答的解释正是它发生的情况,然而,我不能在这里发布完整的代码,因为它太长了,我们会达到同样的目的。我想我理解了这个问题,并将结果映射条目排序到一个有序列表中。谢谢
String orderClause = " case when V.NAME_ = '"+sortColumn+"' then V.TEXT_ end "+sortDirection;
SelectSeekStep1<Record, Object> selectOrdered = select.orderBy(DSL.field(orderClause));
response = selectOrdered.fetchGroups(Task.class, Variable.class);
TASK VARIABLE
1 A
2 B
3 C
1 D
2 E
TASK = 1
VARIABLE = [A, D]
TASK = 2
VARIABLE = [B, E]
TASK = 3
VARIABLE = [C]