我正在使用类似于发布here的查询来获取给定顺序的对象列表。
我也有两个环境,其中一个使用MySQL,另一个使用Oracle。在MySQL中,该答案中给出的HQL(在这里发布以供参考)工作正常,但是当切换到Oracle时,它会转换为无效的结果SQL。
select q from Question q where q.id in (:ids) ORDER BY FIELD(id, :ids)
所以我想扩展Oracle10gDialect并提供这个符合Oracle标准的SQL的翻译:
select q.id
from
Question q
where
q.id in (
1701, 1698, 1264
)
order by
decode(q.id,
1701, 1, 1698, 2, 1264 , 3 )
但我不知道如何定义我的功能。在处理按位时,我扩展了Dialect并使用了这段代码:
registerFunction("bwand", new SQLFunctionTemplate(IntegerType.INSTANCE, "BITAND(?1, ?2)"));
工作正常,但在这种情况下,我需要提供的模式是id列表,后面是它的顺序索引,我不知道如何获得该索引号。
任何帮助?
答案 0 :(得分:0)
Oracle,MySQL和(我相信)Hibernate都支持case
子句中的order by
语句。
所以你可以这样写:
order by (case when q.id = 1701 then 1
when q.id = 1698 then 2
when q.id = 12c4 then 3
end)