Hibernate和Oracle按订单顺序排序

时间:2013-12-16 15:01:27

标签: sql oracle hibernate

我正在使用类似于发布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列表,后面是它的顺序索引,我不知道如何获得该索引号。

任何帮助?

1 个答案:

答案 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)