在Hibernate中使用IF构造

evm*_*evm 3 java sql hibernate hql

我在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();
Run Code Online (Sandbox Code Playgroud)

现在我想用HQL重构这段代码.我怎样才能做到这一点?谢谢.

Vla*_*lev 10

选项1.

用CASE替换IF:

(case when ABS(name) > 0 then LPAD(ABS(name), 4, '0' else name end) AS tord
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅HQL文档

选项2.

HQL支持本机功能.如果将计算封装在自定义SQL函数中,则可以编写如下内容:

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

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

选项3.

如果可能,重写应用程序逻辑.在保存记录之前,有不同的方法可以将所需的填充添加到字段"name".这将在排序期间删除DB中不必要的计算.