Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用join查询的结果在转换为POJO列表时失去顺序_Java_Oracle_Sql Order By_Jooq - Fatal编程技术网

Java 使用join查询的结果在转换为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

我正在使用JOOQ创建对oracle12数据库的本机查询。 当我将结果转换为POJO时,ORDERBY子句中的order将丢失

基本上,我连接了两个表,任务和变量。一个任务可以有许多变量

我通过以下方式将结果转换为我的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()


}
已填充的列表

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]