我正在使用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);
这时我的响应变量已经是一个映射,但是顺序丢失了。
没有错误消息或异常,按预期返回了地图,但是订单丢失了。
请告诉我是否缺少一些关键细节,我将其添加。
答案 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]