在Hibernate中使用IF结构

5
我正在使用HSQL中的条件语句"if":
String q = "SELECT id, name, " +
                "IF (ABS(name) > 0, LPAD(ABS(name), 4, '0'), name) AS tord " +
                "FROM table where city= " + cityId + " order by tord";

    Query query = session.createSQLQuery(q);
    List<Object[]> list = query.list();
    session.getTransaction().commit();
    session.close();

现在我想用HQL重构这段代码。我该怎么做?谢谢。

1个回答

13

选项 1.

使用 CASE 替换 IF:

(case when ABS(name) > 0 then LPAD(ABS(name), 4, '0' else name end) AS tord

请参见HQL文档了解详情。

选项2。

HQL支持本地函数。如果您封装自定义SQL函数中的计算,可以编写类似以下内容:

select t.*, paddNumber(t.name, 4) as tord from TableEntity t 
where t.city = :city order by tord

我没有环境来检查,但认为每个结果记录将表示为Object[]。其中第一个元素将包含您的实体,第二个元素将包含tord。

选项3。

如果可能,请重写应用程序逻辑。有不同的方法可以在保存记录之前向字段“名称”添加所需的填充。这将在排序期间从数据库中删除不必要的计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接